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
.