2013-05-08 3 views
2

Я бег этой команды в одном из моих многочисленных подкаталогов:Запуск команды в нескольких каталогах

ls *.rst -C1 -t | awk 'NR>1' | xargs rm 

По сути, это список всех файлов, которые заканчиваются .rst и сортировать их в зависимости от времени, когда они были созданы и я хочу только последний созданный файл. Затем я удаляю остальные * .rst файлы.

У меня есть 200 каталогов, в которых мне нужно выполнить эту команду. Я попытался использовать команду find, чтобы передать расположение каталогов этой команде, но я не был успешным. Все эти каталоги содержат файлы inputs.in. Я пробовал:

find . -name inputs.in | xargs ls *.rst -C1 -t | awk 'NR>1' | xargs rm 

, но я считаю, так как вход в низкоспиновое * .rst бит полный путь, включая имя файла, он не работает.

Я уверен, что это быстро исправить, но ваша помощь и комментарии будут очень признательны. Я хотел бы запустить эту команду из родительского каталога. Благодаря!

ответ

1

Некоторые уродливым образом:

find . -name inputs.in | xargs dirname |      \ 
    xargs -I{} -n 1 find {} -name '*.rst' | xargs ls -C1 -t | \ 
    awk 'NR>1' | xargs rm 

Ls с групповым символом будет не потому, что подстановка происходит еще до того, найти выполняется.

0

Если у вас установлен GNU Parallel:

find . -name inputs.in | parallel "cd {//} && ls *.rst -C1 -t | awk 'NR>1' | xargs rm" 

Если он не упакован для вашей системы, то это должно установить его в течение 10 секунд:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash 

Чтобы узнать больше: Посмотрите видео для быстрого введения: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Пройдите через учебник (man parallel_tutorial). Командная строка понравится вам.

Смежные вопросы