나는 이 코드를 가지고 있습니다 :
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 '/'