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

321
poissonbreaker

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

ls -l | grep 2014-03 | awk '' | 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 '' 

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

1
Смотрите мой обновленный ответ slhck 10 лет назад 0

2 ответа на вопрос

1
slhck

I'm assuming that you have GNU find. If you want to move files or directories modified within a certain time span (e.g. March 2014) do this:

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

Explanation:

  • find in this directory, without subdirectories
  • files in the range between Feb. 28th and April 1st, where mt refers to modification time. You could also use ct to search for creation time.
  • that aren't named build_tools
  • move all of them to build_tools. The \+ means that all found file/directory names are replaced in {}, instead of one at a time. If you want one at a time, you need \; instead.

A couple of things:

  • Don't parse the output of ls. The format is dependent on the operating system, and picking columns with awk fails if the file / directory names contain whitespace.

  • You used & to concatenate commands, but & just puts a process into the background. If at all, you should have used &&, but all in all, it'd be rather complicated to achieve what you want.

У меня все получилось, но мне это кажется правильным. Это то, что я хотел, спасибо! Я не могу дать вам очки, извините. poissonbreaker 10 лет назад 0
0
poissonbreaker

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

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

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

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

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

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

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