У меня также есть 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
может быть за "цель"?