如何移动名称包含多个特殊字符(如“锓䔓空格”)的文件?

如何移动名称包含多个特殊字符(如“锓䔓空格”)的文件?

我正在尝试将文件从当前目录移动到另一个目录。我遇到的问题是多个文件的名称带有特殊字符,例如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- 默认启用或kshwithset -o globstarbashwith 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 {} +

相关内容