test -n
на первый взгляд уродливо, с тех пор -n
требует аргумента. Я полагаю, что некоторые исторические реализации рассматривали его как синтаксическую ошибку (и возвратил ненулевое состояние). Однако во всех оболочках Вы, вероятно, встретитесь в 21-м веке, поведение четко определено (POSIX, следуя существующей практике): если test
имеет только один аргумент, затем это верно, если и только если тот аргумент непуст.
Обратите внимание, что при игнорировании кавычек тест может закончить тем, что был ложью для некоторых непустых значений $VAR
. Это может даже распечатать сообщение об ошибке, если существуют globbing символы в $VAR
.
VAR='foo -a -z bar'; test -n $VAR || echo "true... and false is false"
VAR='= n-'; test -n $VAR || echo "this is an equality test"
VAR='*'; test -n $VAR || echo "you may or may not see this depending on what files are in the current directory"
test -z $VAR
так же повреждается.
Ksh, удар и zsh имеют a [[ … ]]
условная конструкция, которая подражает традиционному test
и [
утилиты. В отличие от этого, [
, который или является внешней утилитой или является встроенным, которое анализируется как один, [[ … ]]
часть синтаксиса оболочки. Нет никакого разделения слова или globbing внутри [[ … ]]
. [[ -n $VAR ]]
прекрасен (как долго, поскольку Вы не заботитесь, что Ваши сценарии не будут работать под другими оболочками, такими как пепел).
Самое легкое решение состоит в том, чтобы использовать это:
find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 perl -pi -w -e 's/AAA/BBB/g'
В отличие от GNU sed, sed, который поставлется с MAC OSX, требует аргумента -i
опция, указывая резервный суффикс; для подавления резервного копирования, необходимо передать пустую строку (''
). Поэтому sed интерпретировал Ваш s/AAA/BBB/
как резервный суффикс и взятие Вашего имени файла кулака (./myDir/pro ...
) как команда для выполнения. Конечно, .
не допустимая команда sed, вызывая ошибку. Имея это в виду, следующее будет работать:
find [...] | xargs -0 sed -i.bak 's/AAA/BBB/g'
Или, если Вы настаиваете на том, чтобы подавлять резервное копирование
find [...] | xargs -0 sed -i '' 's/AAA/BBB/g'