Как переместить файлы, имена которых содержат несколько специальных символов, таких как «é», «ä», «пробел»?

Как переместить файлы, имена которых содержат несколько специальных символов, таких как «é», «ä», «пробел»?

Я пытаюсь переместить свои файлы из текущего каталога в другой. Проблема, с которой я столкнулся, заключается в том, что у нескольких файлов есть имя со специальными символами, например space, ü, &, (, .... Как мне переместить все мои файлы с помощью команды типа: ls | grep mp4 | xargs -i mv {} mp4, где {}должно быть имя текущего файла, а mp4 — место назначения, куда поместить все мои файлы. Я попробовал команду, но она выдает ошибки. Можете ли вы помочь?

решение1

Это именно та ситуациявы не хотите использоватьlsв. Или xargsс настройками по умолчанию он разделит ввод по пробелам и обрабатывает кавычки и обратные косые черты особым образом. Вам нужно будет использовать -0для разделения ввода по нулевым байтам или -d'\n'для разделения по новым строкам (GNU xargs), чтобы отключить это поведение.

Поскольку все файлы находятся в одном каталоге, вы можете просто использовать оболочку:

mv *mp4* mp4/

Или mv *.mp4 mp4/если вы имели в виду только файлы, файлы, которые имеют mp4расширение. Первый предупредил бы о перемещении mp4себя в mp4.)


Если файлы не находятся в одном каталоге, вам нужно будет либо использовать двойную звездочку ( zsh- включена по умолчанию, либо kshс set -o globstarили bashс 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 велико и не позволяет выполнить предыдущую команду, вы можете использовать GNU findдля достижения того же самого:

find . -maxdepth 1 -name "*mp4*" -exec mv -t mp4 {} +

или

find . -maxdepth 1 -name "*.mp4" -exec mv -t mp4 {} +

Связанный контент