У меня есть каталог с большим количеством файлов и каталогов. Чтобы привести его в порядок, я собираюсь поместить все эти файлы в каталог, поэтому я собирался сделать что-то вроде этого:
$ ls | wc -l
123
$ mkdir new_directory
$ mv * ./new_directory
Однако это явно не сработает, потому что тогда он попытается переместиться new_directory
в new_directory
. Есть ли простой способ сделать то, что я хочу в одной строке, без необходимости копировать и вставлять все файлы и каталоги в этом каталоге?
Ваш
mv * ./new_directorycommand will actually work; it'll just print a warning that it can't move that directory into itself.
Быстрый и грязный лайнер.
mv `ls -A | grep -v new_directory` ./new_directory
Если вы просто ищете файлы (т.е. не каталоги), тогда
find . -type f -maxdepth 1 -exec mv {} ./new_directory/ \;
это самое портативное решение. Для скорости вам следует переместить find и xargs с -print0 и -0, но только если у вас есть GNU find и xargs.
Когда у меня возникала эта проблема, я делал одно из следующих:
$ mkdir ../new-directory
$ mv * ../new-directory/
$ mv ../new-directory .
или
$ mkdir .new-directory
$ mv * .new-directory/
$ mv .new-directory new-directory
Вторая форма использует подстановочный знак, пропускающий имена файлов, начинающиеся с '.'
что о:
cd ..
mv old_dir new_directory
mkdir old_dir
mv new_directory old_dir
IOW, не перемещайте содержимое в новый каталог, а поместите этот каталог в новый.
Аналогично @Рембранответ (хотя и не однострочный):
for FN in *
do
if [ "<new_dir>" != $FN ] then
mv $FN <new_dir>
done
Он должен быть на 100% портативным, даже если find
К сожалению, отсутствует в вашей системе.
Мои предложения: как утверждали другие
mv * ./new_directory
будет работать найти IFF общее расширение достаточно короткое.
В противном случае вы можете попробовать этот, который масштабируется до гораздо большего количества файлов:
find . -type f -maxdepth 1 | xargs -s100000 echo | xargs -iXXX mv XXX new_directory
Объяснение
Использование:
find -mindepth 1 -maxdepth 1 \! -name new_directory -print0 | \
xargs -0 -P 100 -I'{}' mv '{}' new_directory
Из xargs
страница руководства:
-P макс-проков
Run up to max-procs processes at a time;
Чтобы избежать сообщения об ошибке и сделать его простым:
mv *.* ./new_Folder
будет делать то же самое, но не выводить сообщение об ошибке (если в именах папок, я думаю, нет точек).