将具有相同文件扩展名 .txt 的所有文件移动到新目录

将具有相同文件扩展名 .txt 的所有文件移动到新目录

基本上,我的硬盘一片混乱,主目录中有 200 多个子目录。我想将 200 多个子目录中具有扩展名.txtetc 的所有文件移动到新目录。例如,n00b.txt或者n00b.txt.exe

所以我在包含 200 多个子目录的主目录中尝试以下命令sudo mv **/*.txt ~/Desktop/tmpremo/

相反,我收到此错误:bash: /usr/bin/sudo: Argument list too long

为什么我会收到它以及如何删除 say .txt,.txt.exe?我如何解决它?

答案1

这会将当前目录(甚至在子目录中)内任何位置存在的具有扩展名.txt的所有文件移动到..txt.exe~/Desktop/tmpremo

$ sudo find . -type f \( -iname '*.txt' -o -iname '*.txt.exe' \) -exec mv {} ~/Desktop/tmpremo \;

如果您还想要另一个扩展名,只需-o -iname '*.extension'-exec.

sudoPS:正如 @xenoid 所指出的,除非手头的任务绝对需要,否则请不要使用。

答案2

(这里是新手,所以我无法评论@BarBar1234的答案)

我相信不需要回显“find”的输出,因为命令本身已经回显了找到的文件名。

所以你可以只使用:

sudo find . -type f -iname '*.txt'

但是,为了了解知识,您得到的输出 ( find: ‘echo ./rdggt_169/frretcdd_td.txt ’: No such file or directory) 会发生,因为在命令中

sudo find . -type f -iname '*.txt' -exec 'echo {}'  \;

说的部分-exec 'echo {}'是给 一个单引号参数-exec,因此,它将整个扩展字符串视为命令。

需要明确的是,字符串 'echo foo/bar.txt' 不是echo带有 'foo/bar.txt' 参数的命令,这就是为什么在您的系统中找不到任何内容,因为您的系统中不存在名为 的命令echo foo/bar.txt

这就是为什么 BarBar1234 刚刚编辑了答案,删除了单引号。 Nowecho被视为在这种情况下应该被处理的内容,一个命令,而不是一个字符串。

答案3

您收到错误是因为**/*.txt将所有匹配文件(带有完整路径)扩展为非常长的命令行,并且参数的长度有限制。

使用的一个问题是每个文件find ... -exec mv运行一次。mv

有一个命令将尝试运行具有最大允许参数数量的命令: ,因此您只需通过管道传输toxargs的输出并告诉运行(参数默认附加在末尾):findxargsxargsmv

find . -type f -name '*.txt' -print0 | xargs -0 mv -t ~/Desktop/tmpremo

PS:我很惊讶你必须使用sudo在你自己的用户目录中移动文件。

答案4

尝试这个从顶级目录子目录所在的位置:

sudo find . -type f -iname '*.txt' -exec echo {}  \;

如果找到的文件列表显示有问题的文本文件列表,请执行以下操作:

sudo find . -path ~/Desktop/tmpremo -prune -o -type f -iname '*.txt' -exec mv {} ~/Desktop/tmpremo/ \;

相关内容