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

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

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

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

9 голосов | спросил Rory 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 13:35:06 +0400 2009, 13:35:06

9 ответов


13

Ваш

Команда
mv * ./new_directory
будет работать; он просто распечатает предупреждение о том, что он не может переместить этот каталог в себя.
ответил mibus 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 14:50:30 +0400 2009, 14:50:30
10

Быстрый и грязный oneliner.

mv `ls -A | grep -v new_directory` ./new_directory
ответил 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 13:39:14 +0400 2009, 13:39:14
8

Если вы просто ищете файлы (т. е. не каталоги), то

find . -type f -maxdepth 1 -exec mv {} ./new_directory/ \;

- самое портативное решение. Для скорости вы должны перемещать find и xargs с -print0 и -0, но только если у вас есть поиск GNU и xargs.

ответил Cian 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 13:42:31 +0400 2009, 13:42:31
5

Время, когда у меня была эта проблема, я сделал одно из следующих действий:

$ mkdir ../new-directory
$ mv * ../new-directory/
$ mv ../new-directory .

или

$ mkdir .new-directory
$ mv * .new-directory/
$ mv .new-directory new-directory

Во второй форме используется символ, пропускающий имена файлов, начинающиеся с символа '.'

ответил Kenster 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2009 00:58:18 +0400 2009, 00:58:18
2

как насчет:

cd ..
mv old_dir new_directory
mkdir old_dir
mv new_directory old_dir

IOW, не перемещайте содержимое в новый каталог, а помещайте этот каталог в новый.

ответил Javier 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 22:43:31 +0400 2009, 22:43:31
1

Аналогично @ Рембранн (хотя и не однострочный):

for FN in *
do
    if [ "<new_dir>" != $FN ] then
        mv $FN <new_dir>
done

Это должно быть на 100% переносимым, даже если find печально отсутствует в вашей системе.

ответил warren 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 14:09:34 +0400 2009, 14:09:34
1

Мои предложения: Как заявили другие,

mv * ./new_directory

найдет IFF полное расширение достаточно короткое.

В другом случае вы можете попробовать этот, который масштабируется до гораздо большего количества файлов:

find . -type f -maxdepth 1 | xargs -s100000 echo | xargs -iXXX mv XXX new_directory

Объяснение

  1. Список всех файлов.
  2. Группировать все имена файлов в куски макс. 100000 символов.
  3. Создайте одну команду mv для каждого фрагмента.
ответил Niels Basjes 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 15:42:43 +0400 2009, 15:42:43
1

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

find -mindepth 1 -maxdepth 1 \! -name new_directory -print0 | \
    xargs -0 -P 100 -I'{}' mv '{}' new_directory

На странице xargs:

  

-P max-procs

  Run up to max-procs processes at a time;
ответил Cristian Ciupitu 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 08 Sep 2009 23:08:33 +0400 2009, 23:08:33
-1

Чтобы избежать сообщения об ошибке и сохранить его простым:

mv *.* ./new_Folder

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

ответил user157734 1 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 01 Sep 2014 16:05:37 +0400 2014, 16:05:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132