Я выполнил следующую команду, чтобы переместить некоторые каталоги в папку «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/@'
Имейте в виду, что при этом создается новая папка для каждого перемещаемого файла.
Суть в том, что пока другие заботятся об облегчении нашей жизни с помощью лучших и специализированных инструментов, мы все еще можем многому научиться у старых конвейерных запросов. По крайней мере, в моем случае :)