Назад | Перейти на главную страницу

Фрагмент Bash для перемещения всех файлов в каталоге в этот каталог

У меня есть каталог с большим количеством файлов и каталогов. Чтобы привести его в порядок, я собираюсь поместить все эти файлы в каталог, поэтому я собирался сделать что-то вроде этого:

$ ls | wc -l
123
$ mkdir new_directory
$ mv * ./new_directory

Однако это явно не сработает, потому что тогда он попытается переместиться new_directory в new_directory. Есть ли простой способ сделать то, что я хочу в одной строке, без необходимости копировать и вставлять все файлы и каталоги в этом каталоге?

Ваш

mv * ./new_directory
command 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

Объяснение

  1. Список всех файлов.
  2. Сгруппируйте все имена файлов в куски по 100000 символов.
  3. Создайте одну команду mv для каждого фрагмента.

Использование:

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

будет делать то же самое, но не выводить сообщение об ошибке (если в именах папок, я думаю, нет точек).