在Bash中将带有扩展名的文件递归地移动到目标目录中

在Bash中将带有扩展名的文件递归地移动到目标目录中,bash,recursion,mv,Bash,Recursion,Mv,如何将所有.txt文件从文件夹和所有包含的文件夹移动到目标目录中 最好将它们重命名为包含在其中的文件夹,尽管这并不重要。我对bash不太熟悉。要递归移动文件,请将find与mv相结合 find src/dir/ -name '*.txt' -exec mv {} target/dir/ \; 要在移动文件时重命名这些文件,则更为棘手。一种方法是使用循环将每个文件名传递到tr/,该循环将斜杠转换为下划线 find src/dir/ -name '*.txt' | while read file;

如何将所有.txt文件从文件夹和所有包含的文件夹移动到目标目录中


最好将它们重命名为包含在其中的文件夹,尽管这并不重要。我对bash不太熟悉。

要递归移动文件,请将
find
mv
相结合

find src/dir/ -name '*.txt' -exec mv {} target/dir/ \;
要在移动文件时重命名这些文件,则更为棘手。一种方法是使用循环将每个文件名传递到
tr/
,该循环将斜杠转换为下划线

find src/dir/ -name '*.txt' | while read file; do
    mv "$file" "target/dir/$(tr / _ <<< "$file")"
done
读取文件时查找src/dir/-name'*.txt'|;做

mv“$file”target/dir/$(tr/如果只是一个级别:

mv *.txt */*.txt target/directory/somewhere/.
试试这个:

find source -name '*.txt' | xargs -I files mv files target

这将比使用-exec的任何选项都要快,因为它不会为需要移动的每个文件调用单个mv进程。

一个可以处理包含嵌入换行符的文件或以空格开头的版本:
find src/dir-name'*.txt'-exec bash-c'mv“$1”“${1/\/\/}”“;”
比公认的答案快得多。请注意,为了稳健性,最好使用以零结尾的文件名字符串:
查找源文件名'*.txt'-print0 | xargs-0-I files mv files target
我尝试过这个方法,但它移动了意外的文件类型。我只想移动.srt文件,但出于某种原因,这是移动.srt文件d.mkv文件。我尝试使用Cooperised的方法,我看到了相同的行为。在测试中,我在一个有十个子目录的目录中,每个子目录都有几个.srt和几个.mkv文件。为什么这个命令要移动意外的.mkv文件?我在Mac OS上使用stock Bash.Test comma的stock终端应用程序,这是值得的nd在下面:
find.*.srt'-print0 | xargs-0-I文件mv文件