У меня также есть 50 папок с некоторыми подпапками, всего более 1000 аудиофайлов. Мне нужно удалить все подпапки и поместить все файлы в текущий уровень. Пытался, mv */* ./
но это жалобы: список аргументов слишком длинный
shell
command-line
file-management
Педро Гонсалес
источник
источник
t
может быть за "цель"?-t
позвольте сначала указать пункт назначения. соmv
страницы руководства:-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
Обратите внимание, что эта команда перезапишет любые файлы с таким же именем. Вы можете использовать это, чтобы получить запрос перед перезаписью:
объяснение
-type f
: найти только обычные файлы.-mindepth 2
: найти только файлы в подкаталогах.-exec mv -it ./ {}
:-exec
означает «выполнить эту команду для каждого найденного файла».{}
Будут заменены именами файлов.-i
Переключатель делаетmv
интерактивным, он будет запрашивать перед перезаписью существующих файлов и-t
устанавливает целевой каталог./
.+
: объедините файлы (в одну строку аргумента) так, чтобы оболочка могла работать с командой, чтобы вызывать команду минимальное время (не один за другим, а один к нескольким).Что касается дальнейшего удаления пустой папки, вы можете использовать тот же получатель:
источник
-type f
выбирает только простые файлы, исключая символические ссылки, именованные каналы и тому подобное. Для перемещения всех файлов, кроме каталогов, вы можете сделать! -type d
.-L
параметр-i
является стандартным,-t
только для GNU (ничего общего с Linux, который является просто ядром в некоторых системах GNU и не-GNU)-t
не существует в некоторых системах (например, не очень древний AIX)find . -type f -mindepth 2 -exec mv {} ./ \;
Да, это ограничение на совокупный размер аргументов и среды, передаваемых
execve()
системному вызову при выполнении внешней команды.С помощью
zsh
вы можете использовать его встроенныйmv
вместо:Или используйте,
zargs
чтобы разбить список на управляемые куски:С
ksh93
:С GNU
xargs
и GNUmv
сprintf
встроенной оболочкой (большинство,mksh
являясь заметным исключением):источник
zsh
случае, если вы можете поставить некоторые глоб-классификаторы , например,(.)
или(^/)
после последней*
.Довольно портативное решение может быть:
найти все файлы в каждой подпапке и переместить их в текущий каталог
Вы можете добавить
| egrep "\.au$|\.mp3$|\.ac3$"
промежуточный файл, чтобы убедиться, что найденные файлы являются файлами с аудио-расширением (добавьте столько расширений, сколько необходимо, чтобы охватить все типы, я просто предоставил 3 общих)источник
find
вообще. Достаточноecho
илиprintf
find
не решайте проблему, аxargs
решайте.