1

Я выполнил следующую команду, чтобы переместить некоторые каталоги в папку "build_tools", однако результат оказался не таким, как я ожидал.

ls -l | grep 2014-03 | awk '{if ($8!=build_tools) print $8}' | xargs mkdir build_tools/{} && mv {}/ build_tools/{}/

Он переместил папку "build_tools" в одну из папок, созданных awk (zlib) вместе с остальными каталогами, а затем застрял с этим сообщением:

mkdir: no se puede crear el directorio «zlib»: El archivo ya existe

Может кто-нибудь пролить свет на мою ошибку?

РЕДАКТИРОВАТЬ 1:

Вывод ls -l дает мне:

drwxr-xr-x  3 poissonbreaker poissonbreaker     4096 2011-05-02 09:58 antlr3.2
-rw-r--r--  1 poissonbreaker poissonbreaker   318588 2011-05-17 16:21 AppFramework-1.03.jar
-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
drwxr-xr-x  4 poissonbreaker poissonbreaker     4096 2013-01-11 23:13 clutter-sharp
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

Я просто хочу получить файлы с полем даты ($ 6), совпадающим с 2014-03, поэтому я делаю простой grep из этого (ни один файл в каталоге не имеет в качестве имени файла этот шаблон):

ls -l  | grep 2014-03 

Который дает:

-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

Затем я получаю поле имени файла ($ 8) каждого файла через awk для окончательного перемещения в папку build_tools (на данный момент я знаю, в чем была моя ошибка - в этот день также была создана папка build_tools:S). Я оставлю этот вопрос здесь, в случае, если некоторые части будут полезны для всех.

РЕДАКТИРОВАТЬ 2: я изменил выражение awk на:

awk '{if ($8!=build_tools) print $8}'

чтобы это имело смысл.

2 ответа2

1

Я предполагаю, что у вас есть GNU find . Если вы хотите переместить файлы или каталоги, измененные за определенный промежуток времени (например, март 2014 г.), сделайте следующее:

find . -maxdepth 1 \
-newermt 2014-02-28 -not -newermt 2014-04-01 \
-not -name 'build_tools' \
-exec mv {} build_tools \+

Объяснение:

  • найти в этом каталоге, без подкаталогов
  • файлы в диапазоне между 28 февраля и 1 апреля, где mt обозначает время модификации. Вы также можете использовать ct для поиска времени создания.
  • которые не названы build_tools
  • переместите их все в build_tools . \+ Означает, что все найденные имена файлов / каталогов заменяются на {} вместо одного за раз. Если вы хотите по одному, вам нужно \; вместо.

Пара вещей:

  • Не разбирайте вывод ls. Формат зависит от операционной системы, и выбор столбцов с помощью awk завершается неудачно, если имена файлов / каталогов содержат пробелы.

  • Вы использовали & для объединения команд, но & просто помещаете процесс в фоновый режим. Если вообще, вы должны были использовать && , но в целом было бы довольно сложно добиться того, чего вы хотите.

0

Для правильной версии моего решения требуется xargs для обработки нескольких команд, чего можно добиться, заключив команды в:

sh -c (or bash -c) 'Command1; Command2; .. Comandn'

Итак, правильное решение:

ls -l awk ' $8!=build_tools && $6 ~ /2013-03*/ {print $8}' | xargs -I @ sh -c 'mkdir build_tools/@; mv @ build_tools/@'

Помните, что это создает новую папку для каждого файла для перемещения.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .