경로가 /로 끝나지 않아 중단될 때 경로 입력이 /로 끝날 것으로 예상하는 bash 스크립트를 수정합니다.

경로가 /로 끝나지 않아 중단될 때 경로 입력이 /로 끝날 것으로 예상하는 bash 스크립트를 수정합니다.

나는 이 코드를 가지고 있습니다 :

for file in "$@"*png; do
  echo "$file"
done

/ 로 끝나는 경로를 제공하는 경우에만 작동합니다 /root/.

이 경우 스크립트를 중단하지 않고 경로 입력에 /를 추가하는 올바른 방법은 무엇입니까?

끝에 / 없이 경로를 입력하면 다음과 같은 작업이 수행됩니다.

File: /root*png

이를 수정 for file in "$@"/*png; do하고 입력 하면 /root/test/작동하지만 결과가 보기 흉해 보입니다.

File: /root/test//sample2.png

답변1

ilkkachu는 내 답변의 주요 결함을 지적하고 답변에서 이를 수정했으므로 그에게 마땅한 공로를 인정해 주시기 바랍니다. 그러나 나는 또 다른 해결책을 생각해 냈습니다.

#!/bin/bash

for dir in "$@"; do
        find "$dir" -type f -name '*png' -exec readlink -f {}  \;
done

:

$ ll
total 6
-rwxr-xr-x 1 root root 104 Jan  7 14:03 script.sh*
drwxr-xr-x 2 root root   3 Jan  7 04:21 test1/
drwxr-xr-x 2 root root   3 Jan  7 04:21 test2/
drwxr-xr-x 2 root root   3 Jan  7 04:21 test3/

$ for n in {1..3}; do ll "test$n"; done
total 1
-rw-r--r-- 1 root root 0 Jan  7 04:21 testfile.png
total 1
-rw-r--r-- 1 root root 0 Jan  7 04:21 testfile.png
total 1
-rw-r--r-- 1 root root 0 Jan  7 04:21 testfile.png

$ ./script.sh test1 test2/ test3
/root/temp/test1/testfile.png
/root/temp/test2/testfile.png
/root/temp/test3/testfile.png

독창적인 솔루션:

for file in "${@%/}/"*png; do
  echo "$file"
done

${@%/}는 인수 끝에서 /를 제거하고 / 외부의 /는 이를 다시 추가하거나 인수가 없는 인수에 추가합니다.

답변2

이와 같이 glob을 사용하는 것은 약간 이상해 보입니다 $@. 여러 매개변수를 처리할 것으로 예상하면 작동하지 않습니다. 주변 문자열은 $@첫 번째 항목과 목록 항목에만 추가됩니다.

$ mkdir a b; touch a/a.png b/b.png
$ set -- a b 
$ echo x"$@"x
xa bx
$ echo "$@/"*.png
a b/b.png

따라서 여러 매개변수를 처리하려면 별도의 루프가 필요합니다 "$@".

for arg in "$@"; do
    for file in "${arg%/}"/*.png; do
         echo "$file"
    done 
done

다른 경우에는 문자열 대체 확장 ${//}(Bash 또는 zsh에서)을 사용하여 각 위치 매개변수에 접미사를 추가할 수 있지만 glob에서 작동하도록 만드는 것은 매우 어렵습니다.

답변3

tr을 사용할 수도 있습니다.

항상 끝에 /를 추가하고...

file='/root/test//sample2.png';echo "$file" | tr -s '/'

관련 정보