С помощью zsh
, чтобы вывести список каталогов в текущем каталоге, которые содержат файл musthave
, а не файл mustnothave
:
contain() [[ -e $REPLY/$1 || -L $REPLY/$1 ]]
printf '%s\n' *(D/e(contain musthave)^e(contain mustnothave))
Обратите внимание, что выполнение:
find... -exec sh -c 'ls {}' \;
не только не переносим, но и является уязвимостью для внедрения команд. Например, если есть каталог с именем $(reboot)
или ;reboot
, в нем будут запущены командные строки ls $(reboot)
или ls ;reboot
, вызывающие перезагрузку. {}
никогда не следует встраивать в аргумент кода (языка sh
или любого другого языка ), где он может быть неверно истолкован. Используйте:
find... -exec sh -c 'ls "$1"' sh {} \;
вместо этого.
Предполагая , что файл предназначен для формата
field1\n
field2\n
\n
field1\n
field2\n
\n
т. е. последняя строка в файле примера должна читаться как
Mysteriosa Mysteriosa
, тогда это должно помочь, при условии, что после последней записи есть завершающая новая строка \n
sed '$!N;$!N;s/\n/:/g' file | nl -s"|" | sort -t '|' -k2 | awk -F"|" '!_[$2]++' | sort -n | sed -e 's/.*|//' -e 's/:/\n/g'