파일 이름을 바꾸는 대신 빈 값

파일 이름을 바꾸는 대신 빈 값

작업에 대한 쉘이 있지만 그 안에서 null 값을 처리해야 합니다. 따라서 작업에서 단어의 일부를 잘라내고 파일을 삭제하거나 이름을 바꾸지만 다른 if 요소는 비어 있어야 합니다.

예를 들어,
"pear"라는 단어가 있고 이 단어와 파일 이름 null을 사용하여 모두 잘라냈습니다.

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

이제 이름을 "nullfile"로 바꿔야 합니다.

답변1

그리고 zsh:

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

bash또는 를 사용하면 ksh93다음 두 단계로 수행해야 합니다.

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

관련 정보