我正在尝试将文件从当前目录移动到另一个目录。我遇到的问题是多个文件的名称带有特殊字符,例如space, ü, &, (, ...
.如何使用以下命令移动所有文件:ls | grep mp4 | xargs -i mv {} mp4
,其中{}
应该是当前文件的名称,而 mp4 是放置所有文件的目的地。我已经尝试过该命令,但它显示错误。你能帮忙吗?
答案1
情况正是如此你不想使用ls
或者xargs
使用默认设置,它将按空格分割输入,并专门处理引号和反斜杠。您需要使用-0
分隔空字节的输入,或-d'\n'
分隔换行符(GNU xargs)来关闭该行为。
由于所有文件都位于同一目录中,因此您可以使用 shell:
mv *mp4* mp4/
或者,如果您仅指具有扩展名mv *.mp4 mp4/
的文件。mp4
第一个会警告mp4
自己移动到mp4
。)
如果文件不在同一目录中,则需要使用双星(zsh
- 默认启用或ksh
withset -o globstar
或bash
with shopt -s globstar
):
mv **/*mp4* mp4/
或者find
find . -type f -name "*mp*" -exec mv {} mp4/ \;
答案2
命令:
ls | grep mp4 | xargs -i mv {} mp4
在大多数情况下可以被更简单和更强大的替代:
mv *mp4* mp4
您可以忽略有关目录 mp4 不可在其内部移动的警告。
请注意,此脚本与您的脚本一样,正在移动mp4
名称中任何位置出现“ ”的所有文件(例如:mp4list.txt
, lamp4.jpg
)。如果您实际上只想移动扩展名为“ .mp4
”的文件,您可以使用:
mv *.mp4 mp4
mp4
这将防止出现导致有关目录本身的错误消息的情况。
如果 mp4 文件的数量很大并且阻止前一个命令工作,您可以使用 GNUfind
来实现相同的目的:
find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +
或者
find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +