Я пытаюсь переместить свои файлы из текущего каталога в другой. Проблема, с которой я столкнулся, заключается в том, что у нескольких файлов есть имя со специальными символами, например 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 {} +