перемещение каталогов после grep

перемещение каталогов после grep

Я выполнил следующую команду, чтобы переместить некоторые каталоги в папку «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). Я оставлю этот вопрос здесь, на случай, если некоторые части окажутся кому-то полезными.

EDIT 2: Я изменил выражение awk на:

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

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

решение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невозможен, если имена файлов/каталогов содержат пробелы.

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

решение2

Правильная версия для моего решения требует 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/@'

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

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

Связанный контент