HP-UX ***** B.11.23 U ia64 **** безлимитная лицензия
find . -type d -name *log* | xargs ls -la
дает мне имена каталогов (те, которые содержатся log
в имени каталога), за которыми следуют все файлы в этом каталоге.
Каталоги /var/opt/SID/application_a/log/
, /var/opt/SID/application_b/log/
, /var/opt/SID/application_c/log/
и так далее содержат файлы журналов.
Я хочу, чтобы команда указала только два последних файла журнала ls
, которые я обычно использую ls -latr | tail -2
.
На выходе должно быть что-то вроде этого ..
/var/opt/SID/application_a/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
find . -type d -name *log* | xargs ls -la | tail -2
не дает мне вышеуказанный результат. То, что я получаю, это список последних двух find . -type d -name *log* | xargs ls -la
командных файлов
.
Так я могу передать команды после передачи по каналу xargs
? Как еще я могу запросить, чтобы получить результирующий список файлов в вышеуказанном формате?
find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"
дает мне список из десяти имен каталогов внутри текущего каталога, который, как оказалось, /var/opt/SID
и это тоже не то, что я хочу.
*log*
противном случае оболочка расширит его.sh -c
виду, что ожидает имя команды (параметр 0) в качестве второго аргумента, поэтому вы всегда должны это делатьfind . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail
(обратите вниманиеlstail
на конец, который будет служить$0
для созданной оболочки). В противном случае первый из ваших результатов заполнит эту роль и останется неиспользованным.Ответы:
Вы почти там. В вашей последней команде вы можете использовать,
-I
чтобы сделатьls
правильноИтак, с
Вы
echo
найдете каталогfind
, а затем сделайтеls | tail
это.источник
xargs -n 1 sh -c 'echo $0'
echo $0
была полезна (и более понятна)-print0
,xargs -0
и бежать{}
в двойные кавычки внутри вsh
команде:find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"
GNU Parallel упрощает такие задачи:
Если вы не хотите делать полную установку GNU Parallel, вы можете выполнить минимальную установку: http://git.savannah.gnu.org/cgit/parallel.git/tree/README
источник
Просто в дополнение к fredtantini и в качестве общего пояснения (поскольку документы немного сбивают с толку):
Команда
xargs -I {}
возьмет символы '{}' из стандартного ввода и заменит их на все, что приходит из канала. Это означает, что вы могли бы заменить{}
любую комбинацию символов (возможно, для лучшего соответствия вашему предпочтению программирования). Например :xargs -I % sh -c "echo %"
. Если вы всегда используете его,xargs -I {}
вы можете заменить егоxargs -i
на условное обозначение.Команда
sh -c
скажет вашей bash / shell читать следующую команду из строки, а не из стандартного ввода. Так что написаниеsh -c "echo something"
эквивалентноecho something
.xargs -I {} sh -c "echo {}"
Будет читать ввод созданных с помощьюsh -c
которой являетсяecho {}
. Так как вы сказали заменить{}
его аргументами, полученными из канала, вот что произойдет.Вы можете легко проверить это, даже не прибегая к трубопроводу, просто введите указанную выше команду в терминале. Все, что вы напишете дальше, будет выведено на терминал (Ctrl-D для выхода).
В
ls -la {}
команде то же самое происходит снова.{}
Заменяется содержимым команды предварительной трубы.источник