문자열 비교를 사용하여 태그가 지정된 파일을 찾고 표시를 해제하시겠습니까?

문자열 비교를 사용하여 태그가 지정된 파일을 찾고 표시를 해제하시겠습니까?

Bash에는 while 루프를 사용하여 특정 폴더의 파일을 다양한 디렉터리로 복사하는 스크립트가 있습니다. 내가 작성한 각 파일을 복사 한 후

mv $dir/$file $dir/_$file

_파일 이 복사되었음을 표시하기 위해 파일의 접두사에 사용됩니다 . ( $dir파일이 복사된 위치입니다.) 루프가 끝나면 스크립트는 표시되지 않은 파일을 나열하여 아직 복사되지 않은 파일을 표시합니다.

특정 파일이 여러 디렉터리에 여러 번 복사되었지만 파일 이름이 변경되어 다시 복사할 수 없는 작은 충돌이 발생했습니다.

써보고 싶었는데 if [ $file -eq $dir/_$file ]잘 안되네요. "_$file"주어진 디렉토리를 확인하는 쉬운 방법은 무엇입니까 "$file"?

이 모든 것을 달성할 수 있는 더 좋은 방법이 있다면 좋을 것입니다.

답변1

다음으로 확장되는 파일이 주어지면 $filename:

if [[ -f "dir/_${filename}" ]]; then
    echo "The prefixed copy exists."
else
    echo "The prefixed copy does not exist."
fi

답변2

답을 보았지만 답도 떠올랐습니다. 아마도 이것은 누군가에게 도움이 될 것입니다.

#!/bin/sh

filename="file"
directory="bash_test"

if [ "$filename" = "$(basename $directory/_$filename|tr -d ^_)" ]
then
    echo "Prefix exists."
else
    echo "Prefix not exists."
fi

답변3

나는 이것을 사용하여 그것을 알아낼 수 있었습니다:

[ -f $dir/_$file ]

또는

if [ -f $dir/_$file ]; then

특정 접두어가 붙은 파일이 있는지 확인하면 됩니다. 간단히 말해서, 필요한 것보다 더 어렵게 만들었습니다.

변수를 인용할 때 따옴표를 사용해야 할지 모르겠는 경우가 있습니다.

답변4

-eq인수가 정수가 아니기 때문에 테스트 가 실패합니다( -eq두 정수의 산술 동등성 테스트).

당신이 하고 싶은 일은 밑줄 친 이름이 일반 파일이 아닌 다른 파일에서 이미 사용되고 있는지 확인하는 것입니다.

당신은 이것을 할 수 있습니다

if [ -e "$dir/_$file" ]; then
    printf 'The name "%s" already exists in directory %s\n' "_$file" "$dir"
fi

$dir/_$file위에 표시된 것처럼 큰따옴표를 사용하거나 (및 둘 다 인용 된 "$dir"/_"$file"경우 ) 큰따옴표를 사용해야 합니다 . 이렇게 하면 변수 값의 토큰화가 방지되므로 어떤 이유로 변수 중 하나 또는 둘 모두에 공백 문자가 포함되어 있는 경우 런타임 구문 오류가 방지됩니다. 또한 디렉터리 및 파일 이름에 대한 파일 이름 생성(와일드카드) 호출을 방지합니다.$dir$file

-e예를 들어, 여러분도 알고 싶어할 것이라고 가정하기 때문에 이 테스트를 사용했습니다.목차밑줄 친 디렉토리 이름입니다 $dir.

관련 정보