У меня также есть 50 папок с некоторыми подпапками, всего более 1000 аудиофайлов. Мне нужно удалить все подпапки и поместить все файлы в текущий уровень. Пытался, mv */* ./но это жалобы: список аргументов слишком длинный
У меня также есть 50 папок с некоторыми подпапками, всего более 1000 аудиофайлов. Мне нужно удалить все подпапки и поместить все файлы в текущий уровень. Пытался, mv */* ./но это жалобы: список аргументов слишком длинный
Ответы:
Я предполагаю, что ваши аудио файлы расширены .mp3
find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +
Замените .mp3своим расширением аудио файлов
Замените <AudioParentFolderPath>родительской папкой, содержащей ваши подпапки.
Замените <YourTargetFolder>путь к папке, в которую нужно поместить все файлы.
Если файлы буксировки из разных подпапок имеют одинаковые имена, будет перемещен только один.
редактировать: как сказал Костас : « -iПереключатель делает mvинтерактивным, он будет запрашивать перед перезаписью существующих файлов»
-tпозвольте сначала указать пункт назначения. со mvстраницы руководства: -t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY
find . -type f -mindepth 2 -exec mv -t ./ {} +
Обратите внимание, что эта команда перезапишет любые файлы с таким же именем. Вы можете использовать это, чтобы получить запрос перед перезаписью:
find . -type f -mindepth 2 -exec mv -it ./ {} +
-type f : найти только обычные файлы.-mindepth 2 : найти только файлы в подкаталогах.-exec mv -it ./ {}: -execозначает «выполнить эту команду для каждого найденного файла». {}Будут заменены именами файлов. -iПереключатель делает mvинтерактивным, он будет запрашивать перед перезаписью существующих файлов и -tустанавливает целевой каталог ./.+: объедините файлы (в одну строку аргумента) так, чтобы оболочка могла работать с командой, чтобы вызывать команду минимальное время (не один за другим, а один к нескольким).Что касается дальнейшего удаления пустой папки, вы можете использовать тот же получатель:
find . -type d -empty -delete
-type fвыбирает только простые файлы, исключая символические ссылки, именованные каналы и тому подобное. Для перемещения всех файлов, кроме каталогов, вы можете сделать ! -type d.
-Lпараметр
-iявляется стандартным, -tтолько для GNU (ничего общего с Linux, который является просто ядром в некоторых системах GNU и не-GNU)
-tне существует в некоторых системах (например, не очень древний AIX)
find . -type f -mindepth 2 -exec mv {} ./ \;
Да, это ограничение на совокупный размер аргументов и среды, передаваемых execve()системному вызову при выполнении внешней команды.
С помощью zshвы можете использовать его встроенный mvвместо:
zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .
Или используйте, zargsчтобы разбить список на управляемые куски:
autoload zargs
zargs -Ifiles ./*/* -- mv files .
С ksh93:
command -x mv ./*/* .
С GNU xargsи GNU mvс printfвстроенной оболочкой (большинство, mkshявляясь заметным исключением):
printf '%s\0' ./*/* | xargs -r0 mv -t .
zshслучае, если вы можете поставить некоторые глоб-классификаторы , например, (.)или (^/)после последней *.
Довольно портативное решение может быть:
найти все файлы в каждой подпапке и переместить их в текущий каталог
find ./*/ -type f -print | xargs mv -i "{}" ./
Вы можете добавить | egrep "\.au$|\.mp3$|\.ac3$"промежуточный файл, чтобы убедиться, что найденные файлы являются файлами с аудио-расширением (добавьте столько расширений, сколько необходимо, чтобы охватить все типы, я просто предоставил 3 общих)
findвообще. Достаточно echoилиprintf
findне решайте проблему, а xargsрешайте.
tможет быть за "цель"?