基本上,我的硬盘一片混乱,主目录中有 200 多个子目录。我想将 200 多个子目录中具有扩展名.txt
etc 的所有文件移动到新目录。例如,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
.
sudo
PS:正如 @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
的输出并告诉运行(参数默认附加在末尾):find
xargs
xargs
mv
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/ \;