ファイル名を変更する代わりに空の値

ファイル名を変更する代わりに空の値

アクション用のシェルがありますが、その中でnull値を処理する必要があります。したがって、タスクから単語の一部を切り取り、ファイルを削除または名前を変更しますが、他のif要素は空でなければなりません。

たとえば、
「pear」という単語があり、この単語とファイル名 null を使用して両方を切り捨てました。

echo $fname | perl -p -e 's/:pear://g'

これで名前を "nullfile"に変更する必要があります。

答え1

そしてzsh

newname=${${fname//:pear:}:-nullfile}

bashまたはを使用する場合は、次のksh932つの手順で行う必要があります。

newname=${fname//:pear:}
newname=${newname:-nullfile}

POSIXlyから文字列内のすべてのエントリを削除するには、次の手順を実行する必要があります。

newname=$(
  printf '%s\n' "$fname" | sed 's/:pear://g'; echo .
)
newname=${newname%??}
newname=${newname:-nullfile}

これは次のように単純化できます。

newname=$(
  printf '%s\n' "$fname" | sed 's/:pear://g'
)
newname=${newname:-nullfile}

保証できれば$fname改行文字で終わらないでしょう。

答え2

#!/bin/bash
{ read -r dirname fname
  read second
} < <(find . -type f -name '*:pear:*' -printf '%h %f\n')
if [ -z "$second" -a -n "$fname" ] ; then
    newname="${fname/:pear:/}"
    if [ -e "$dirname/${newname:=nullfile}" ] ; then
        rm -f "$dirname/$newname"
        echo "Deleted file $dirname/$newname"
    fi 
    mv "$dirname/"{"$fname", "$newname"}
    echo "Renamed file $dirname/$fname to $dirname/$newname"
fi

答え3

変数が空の場合は、パラメータ置換を使用してデフォルト値を指定できます。

$ filename="string of pearls"
$ newname=$( sed 's/pear//g' <<<"$filename" )
$ echo "${newname:-nullfile}"
string of ls
$ filename=pear
$ newname=$( sed 's/pear//g' <<<"$filename" )
$ echo "${newname:-nullfile}"
nullfile

実際、sedやperlを呼び出す必要もありません。パラメータ置換4 teh win!

$ filename="spear pearl"
$ newname=${filename//pear/}
$ echo "${newname:-nullfile}"
s l
$ filename=pear
$ newname=${filename//pear/}
$ echo "${newname:-nullfile}"
nullfile

関連情報