从任何子目录

时间:2015-10-07 17:59:15

标签: bash shell

我有一个文本文件,其中包含如下文件列表:

list.txt的内容:

file1.txt
file2.txt
file3.txt

我需要搜索一个目录(及其子目录)来查找每个文件并将其复制到另一个目录中。

当前目录: -dir    -subdir1    -subdir2    -subdir3    -subdir4    -outputdir

在这个例子中,我可能会:

  • file1.txt
  • 中找到subdir3
  • file2.txt
  • 中找到subdir1
  • file3.txt可能不存在

在这种情况下,它会复制file1.txt& file2.txt outputdir

我没有太多经验在命令行上这样做,但有1200个文件要移动,所以我不能手动完成。这是我得到的最接近的东西,但它没有找到任何文件,因为它们都在子目录中:

xargs -a list.txt cp -t outputdir

对你给出的命令的解释也会非常有帮助。搜索周围也提出了“bash for loops”,我试图使用它但无法弄清楚所有错综复杂的行为:

FOR /R "%~dp0" %%I IN (.) DO  for /f "usebackq delims=" %%a in ("%~dp0list.txt") do echo d |xcopy "%%I\%%a" "outputdir" /e /i

1 个答案:

答案 0 :(得分:0)

如果您有bash 4,请使用以下内容:

shopt -s globstar nullglob
while IFS= read -r fname; do
    files=("$dir"/**/"$fname")
    if (( ${#files[@]} > 0 )); then
        cp "${files[@]}" "$outputdir"
    fi
done < list.txt

while循环一次从list.txt一行读取。 **模式匹配零个或多个目录; files可以包含0个或更多匹配文件。如果数组不为空,则所有文件名都将传递给cp进行复制。

对于旧版本,请使用find

while IFS= read -r fname; do
    find "$dir" -name "$fname" -type f -exec cp {} "$outputdir" \;
done < list.txt

这只是在$dir下找到所有匹配的文件,并在每个文件上运行cp