У меня есть 100 файлов в одной папке, включая папку с именем «target». Я хочу перенести все файлы из этой папки в папку target (за исключением самой папки target).
Есть ли эффективная терминальная команда для этого?
решение1
Если в вашем каталоге находятся только файлы (и целевой каталог), просто используйте mv
, вместо find
:
mv * target
Он сообщит, что «цель» не может быть перемещена сама по себе, но все файлы впоследствии будут в цели.
решение2
Использовать это
$ mv target ..
$ mv * ../target
$ mv ../target .
решение3
Это тоже работает:
find . -maxdepth 1 ! -name target ! -name . -exec mv "{}" target \;
Одним из ключевых преимуществ find
чрезмерного использования автодополнения bash является то, что вы одновременно получаете скрытые файлы. mv * ...
этого не произойдет.
Возможно, вы могли бы пойти чем-то вроде:
mv -t target * .[^.]*
Или, как указывает Джеймс, вы можете сократить команду find, чтобы она просматривала только файлы... И, как указал LoremIpsum, если их миллиарды, использование xargs
будет немного эффективнее:
find . -maxdepth 1 -type f -print0 | xargs -0 mv -t target
решение4
Подход перемещения целевого каталога в предыдущий, затем перемещения всего в него и, наконец, перемещения обратно в текущий каталог, если все в порядке. Единственная проблема в том, что это не работает для каталога проекта git, где нам нужно хранить историю.
Итак, для каталога git просто переместите его так:git mv * цель -k
The-копция используется для пропуска ошибок перемещения/переименования