空值而不是重命名文件

空值而不是重命名文件

我有一个任务的外壳,但我应该处理其中的空值。因此,在任务中,我剪切了单词的一部分,并删除或重命名该文件,但需要另一个 if 元素为空。

例如:
我有单词“pear”,我用这个和文件名 null 将其全部剪切:

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

我现在应该重命名为“nullfile”。

答案1

zsh

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

使用bashksh93,您必须分两步完成:

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

相关内容