如何将目录的创建添加到此 cli 命令中

如何将目录的创建添加到此 cli 命令中

我正在遍历一个目录,查找子目录,查找某些文件,然后将它们复制到其他地方......我正在这样做:

for i in `ls ./*/filename`; do cp $i ../test2; done

这需要所有这些文件名并将它们移动到 test2 目录中...事情是我还需要源目录名...我认为这可以用 awk 完成,但我一无所知并且挣扎...

for i in `ls ./dirname/filename`; do cp ../test2/dirname/; done

我无法复制整个目录名,因为我不需要其中的所有文件......

答案1

要将特定文件或目录的整个目录路径复制到另一个目录,您至少有两个选择:

cpGNU coreutils 中,使用--parents

cp --parents ./*/sourcefile /some/path/destdir

rsync、使用-R--relative

rsync -R ./*/sourcefile /some/path/destdir

这会将每个源文件放置在目标目录下的源路径下,以便将eg./a/sourcefile复制到/some/path/destdir/a/sourcefile此处显示的命令中。

请注意,执行此操作时无需循环任何文件。

cp在没有 GNU和 的系统上rsync,您可以执行循环,但您不希望循环 的输出ls。反而

for pathname in ./*/sourcefile; do
    destdir="/some/path/destdir/$(dirname "$pathname")"
    mkdir -p "$destdir" && cp "$pathname" "$destdir"
done

这将循环遍历您想要复制的所有文件,并且对于每个文件,它将确保存在相应的目标目录,然后将文件复制到那里。

例子:

$ tree
.
|-- dest
`-- src
    |-- a
    |   |-- file
    |   `-- something-else
    |-- b
    |   |-- file
    |   `-- something-else
    |-- c
    |   |-- file
    |   `-- something-else
    |-- d
    |   |-- file
    |   `-- something-else
    `-- e
        |-- file
        `-- something-else

7 directories, 10 files

此处输入上述两个命令(或循环)中的任何一个,源为./src/*/file,目标为./dest

$ tree
.
|-- dest
|   `-- src
|       |-- a
|       |   `-- file
|       |-- b
|       |   `-- file
|       |-- c
|       |   `-- file
|       |-- d
|       |   `-- file
|       `-- e
|           `-- file
`-- src
    |-- a
    |   |-- file
    |   `-- something-else
    |-- b
    |   |-- file
    |   `-- something-else
    |-- c
    |   |-- file
    |   `-- something-else
    |-- d
    |   |-- file
    |   `-- something-else
    `-- e
        |-- file
        `-- something-else

13 directories, 15 files

答案2

尝试使用 rsync -R (--relative) 标志来执行此操作:

$ for i in ls ./*/filename; do rsync -avR $i ../test2; done

-R 标志同步命令行上给出的完整路径。

相关内容