'найдите' с несколькими, '-имя' и '-должностное-лицо' выполняют только последние соответствия '-имени'

Я получаю чувство, что Вы - очень "каталог, ориентированный", и, в этом случае, этот мог бы комплект Ваш менталитет лучше.

(Но честно говоря, я думаю, что это - плохая идея в целом, Вы хотели бы, чтобы команды были глобальны.)

В .bashrc, поместить alias go="./.cmd" (затем source ~/.bashrc).

Затем в каждом таком каталоге, помещает названный сценарий .cmd, затем chmod +x .cmd, затем просто go сделайте свою вещь.

76
22.11.2013, 12:52
2 ответа
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"

коротко для:

find . \( \( -type f -a -name "*.htm*" \) -o \
          \( -name "*.js*" \) -o \
          \( -name "*.txt" \) \
       \) -a -print

Таким образом, потому что никакой предикат действия не указан (только условия), a -print действие неявно добавляется для файлов, которые соответствуют условиям.

(и, между прочим, который распечатал бы нерегулярный .js файлы ( -type f только относится .htm файлы)).

В то время как:

find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \
  -exec sh -c 'echo "$0"' {} \;

коротко для:

find . \( -type f -a -name "*.htm*" \) -o \
       \( -name "*.js*" \) -o \
       \( -name "*.txt" -a -exec sh -c 'echo "$0"' {} \; \)

Для find (как на многих языках), И (-a; неявный при исключении) имеет приоритет ИЛИ (-o) и добавление явного предиката действия (здесь -exec) отмены -print неявное действие, замеченное выше. Здесь, Вы хотите:

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) \
  -exec sh -c 'echo "$0"' {} \;

Или:

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c '
   for i do
     echo "$i"
   done' sh {} +

Постараться не выполнять тот sh на файл.

102
27.01.2020, 19:31
  • 1
    В некоторых из тех sh-c использование, необходимо добавить нулевой аргумент в пользу sh (хотя в других Вы уже включали его). –  James Youngman 10.12.2013, 01:14
  • 2
    Это - большой ответ! –  Marinos An 28.02.2018, 23:05

Это - подразумеваемые скобки. Добавьте явные скобки. \( \)

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -exec sh -c 'echo "$0"' {} \;

или использование xargs (мне нравится xargs, я нахожу это легче, но по-видимому не как портативное).

find . -type f \( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" \) -print0 | xargs -0 -n1 echo
30
27.01.2020, 19:31

Теги

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