Относительно использования xargs в команде поиска

У меня есть один сценарий, в котором мне нужно выбрать все файлы, содержащие чужие кодеры.числовые цифры, такие как алиенодеры.1206, и команда find также должна искать все подкаталоги. Если такого файла нет, он ничего не должен делать.

Я написал :

find /home/jassi/ -name "aliencoders.[0-9]+" | xargs ls -lrt | awk print '$9'

Бит говорит, что такого файла или каталога нет, если такой файл не начинается с Aliencoders.xx...

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

В настоящее время, если такого файла нет, он берет текущий каталог t find вместо /home/jassi.


person Jassi    schedule 18.06.2012    source источник
comment
какую оболочку вы используете? Баш? ткш?   -  person Levon    schedule 18.06.2012
comment
также .. вы хотите awk '{print $9}' нет?   -  person Levon    schedule 18.06.2012
comment
я использую tcsh, и мне нужно было получить все такие файлы в отсортированном порядке, поэтому xargs ls -lRt, а затем мне нужно напечатать только последний столбец, который является именем файла с полным путем, поэтому конвейер с awk   -  person Jassi    schedule 18.06.2012
comment
Если все каталоги находятся в /home/jassi, а не на более глубоких уровнях, вы можете заменить find на for i in "/home/jassi/aliencoders.[0-9]+" ; do ls -lrt $i | awk '{print $9} ; done.   -  person ott--    schedule 18.06.2012
comment
Нет, у него тоже есть более глубокий уровень, и я думаю, что либо мне нужно использовать команду find с xargs, либо модуль File::Find с регулярным выражением.   -  person Jassi    schedule 19.06.2012


Ответы (2)


Если вы не хотите, чтобы xargs выполнялось, если ввод пуст, вы можете использовать -r или --no-run-if-empty, которые являются расширениями GNU, как указано в справочная страница. Так что, если у вас есть эта поддержка, вы можете попробовать
find /home/jassi/ -name "aliencoders.[0-9]+" | xargs -r ls -lrt | awk '{print $9}'
В качестве альтернативы вы можете использовать опцию exec с find, чтобы добиться чего-то в этих строках
find /home/jassi/ -name "aliencoders.[0-9]+" -exec ls -lrt {} + | awk '{print $9}'
Надеюсь, это поможет!

person another.anon.coward    schedule 18.06.2012
comment
На самом деле команда find /home/jassi/ -name Aliencoders.[0-9]+ также извлекала все из текущего каталога. Поэтому я изменил его, чтобы найти /home/jassi/ -type f -name Aliencoders.[0-9]+, тогда он работал нормально, но давал необычный результат. и опция -r в xargs, похоже, не работает. Я в оболочке tcsh. Я обновлю снова. - person Jassi; 19.06.2012

баш:

Попробуйте эту команду (в оболочке bash, так как ее использует большинство людей, а оболочка не указана):

find /home/jassi/ -name "aliencoders.[0-9]+" 2>&1 | xargs ls -lrt | awk '{print $9}'

С помощью 2>&1 вы перенаправляете сообщения об ошибках с stderr на stdout. Когда у вас есть этот единственный выходной поток, вы можете обрабатывать его с помощью ваших каналов и т. д.

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

Все о перенаправлении предоставит вам более подробную информацию и контроль над перенаправлением.

ОБНОВЛЕНИЕ:

tcsh:

Основываясь на использовании tcsh (иногда мне кажется, что я единственный, кто его использует), можно перенаправить stderr на stdout с помощью следующей конструкции:

command |& ...

so

find /home/jassi/ -name "aliencoders.[0-9]+" |& xargs ls -lrt | awk '{print $9}'

должно помочь. До того, как ваши сообщения об ошибках обходили ваши каналы и направлялись непосредственно в консоль, ваши каналы обрабатывали только stdout. При этом все ваши выходные данные проходят по каналам, и вы можете отфильтровать то, что хотите.

Также обратите внимание на использование команды awk в конце команды:

awk '{print $9}'

отличается от того, что вы написали изначально.

person Levon    schedule 18.06.2012
comment
Спасибо, парни. Это фактически решило проблему. Я использовал -r с xargs, который кажется немного более эффективным, чем команда exec, и просто добавил тип -f в команду поиска. Это сработало так, как мы думали. Спасибо еще раз - person Jassi; 19.06.2012