gpt4 book ai didi

regex - 通过 shell 脚本复制目录结构

转载 作者:行者123 更新时间:2023-11-29 09:35:51 26 4
gpt4 key购买 nike

我的机器目录结构如下

 bhagwat        durga    Sai Baba    vishnu sahastranam
bhagwat geeta hanuman ramayan audio shiv vishnu

在这上面所有的都是名字中有空格的目录。即,如果您执行 ls -l,您将看到以下内容

drwx------ 1 deel deel        0 2011-09-12 21:34 bhagwat
drwx------ 1 deel deel 8192 2011-09-09 22:35 bhagwat geeta
drwx------ 1 deel deel 4096 2011-10-07 05:10 durga
drwx------ 1 deel deel 0 2011-10-29 09:23 hanuman
drwx------ 1 deel deel 8192 2011-09-30 22:48 ramayan audio
drwx------ 1 deel deel 4096 2011-09-18 12:16 Sai Baba
drwx------ 1 deel deel 4096 2011-09-26 19:19 shiv
drwx------ 1 deel deel 4096 2011-09-26 19:20 vishnu
drwx------ 1 deel deel 4096 2011-09-16 11:35 vishnu sahastranam

其中有更多的子文件夹。我不想复制文件或目录。我想在其他一些位置或设备上创建一个如上所述的目录结构。这类似于源目录中存在的内容。因此,我正在编写如下相同的脚本

#!/bin/bash
for i in `ls /media/New\ Volume/bhajans`;do
echo $i
done

现在这种方法的问题是它会导致以下输出

bhagwat
bhagwat
geeta
durga
hanuman
ramayan
audio
Sai
Baba
shiv
vishnu
vishnu
sahastranam

如果您注意到输出,目录名称中的空格被视为单独的目录。这是不正确的。那么我该如何解决这个问题。我想创建与源文件夹中存在的目录结构相同的目录结构。

编辑
我使用的是 Ubuntu 11.04
更新
每个被克隆的子目录都有一个名为 script.sh 的脚本,所以我不仅要克隆目录结构,还要将 script.sh 从父目录复制到克隆的目的地。Kevin 和 Jonathan 感谢您的解释和回答。

最佳答案

将目录结构(递归地)从olddir克隆到newdir:

find olddir -type d -printf "newdir/%P\0" | xargs -0 mkdir -p

如果您只想要第一层,请将 -maxdepth 1 添加到 find

解释:

find,当然是递归地搜索目录并对找到的文件进行操作。 olddir 告诉它在名为“olddir”的目录中搜索。 -type d 指定它应该只作用于目录。 -printf 告诉它打印以下模式: newdir 是您要将结构克隆到的目录。 %P 打印没有 olddir 部分的文件名,\0 告诉它以空字符结束名称。这个空字符将允许我们将任何合法的文件名传递给 xargsxargs 使用它从标准输入中读取的内容作为参数来执行您给它的命令。 -0 告诉它使用空字节 (\0) 来确定应该在哪里分隔参数(在我们的例子中是文件名)。否则它会使用空格,我们知道我们不希望它这样做。 -p 告诉 mkdir 如果父目录不存在则创建它们。

好的,复制每个文件有点棘手,但我很确定这在所有情况下都有效(至少在安装了兼容 [gnu] find 的所有情况下)上面的命令:

$ find olddir -name script.sh -printf "%p\0" -printf "newdir/%P\0" | xargs -0L2 cp -n

第一个 printf 打印源(现有)文件 (%p),第二个打印目标文件。两者都以 \0 结尾,就像我们之前所做的那样。 xargs 的新参数 -L2 告诉 xargs 从其输入中一次获取两 (2) 个参数(文件)并使每个命令仅与他们两个一起运行。所以 printf 语句和 L2 的顺序非常重要。 -n 告诉 cp 如果目标存在则不要覆盖它,以防万一我们中的一个人犯了错误。

关于regex - 通过 shell 脚本复制目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8845610/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com