我正在遍历一个目录,查找子目录,查找某些文件,然后将它们复制到其他地方......我正在这样做:
for i in `ls ./*/filename`; do cp $i ../test2; done
这需要所有这些文件名并将它们移动到 test2 目录中...事情是我还需要源目录名...我认为这可以用 awk 完成,但我一无所知并且挣扎...
for i in `ls ./dirname/filename`; do cp ../test2/dirname/; done
我无法复制整个目录名,因为我不需要其中的所有文件......
答案1
要将特定文件或目录的整个目录路径复制到另一个目录,您至少有两个选择:
从cp
GNU 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 标志同步命令行上给出的完整路径。