![bash에서 이름이 지정되지 않은 파일을 찾는 방법은 무엇입니까? [폐쇄]](https://linux55.com/image/61744/bash%EC%97%90%EC%84%9C%20%EC%9D%B4%EB%A6%84%EC%9D%B4%20%EC%A7%80%EC%A0%95%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%B0%BE%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
내 서버에 파일을 쉽게 업로드하는 다음과 같은 bash가 있습니다.
FILE=../"$1"/1.txt
scp 1.txt remoteserver #upload the file to a remote server.
$1은 입력 디렉터리용이고 많은 디렉터리가 있습니다. 그러나 이 모든 디렉토리의 txt 파일 이름은 "1.txt"가 아닙니다. 제가 확인할 수 있는 것은 각 디렉터리에 txt 파일이 하나만 포함되어 있다는 것입니다.
이 경우 파일을 찾는 방법은 무엇입니까?
고쳐 쓰다:
들어가려고 하는데FILE=../"$1"/1.txt
하지만 다음을 사용하여 파일을 확인할 때:
if [ -f "$FILE" ]
파일이 존재하는데도 오류가 발생하는 것으로 나타났습니다.
내가 찾은 것 :
$FILE
예../test/1.txt
"$FILE"
예../test/*.txt
그럼 이거 삭제해야 하는 거 맞죠 "
?
답변1
*
모르는 이름을 나타내기 위해 와일드카드를 사용할 수 있습니다 . 당신이 설정했다고 가정
FILE=../"$1"/*.txt
와일드카드 확장은 따옴표 밖에서만 발생합니다. $FILE
변수에는 여전히 별표가 있습니다. 그래서,
[ -f "$FILE" ]
동등하다
[ -f "../test/*.txt" ]
파일 이름에 별표가 필요하지만
[ -f $FILE ]
동등하다
[ -f ../test/*.txt ]
확장되었습니다.
$FILE
패턴을 저장하는 데 약간 위험합니다. "$1"
공백을 포함하면 따옴표가 있든 없든 작동하도록 할 수 없습니다. 따옴표를 사용하면 공백이 유지되지만 별표도 마찬가지이지만 공백이 없으면 공백 지점에서 분할됩니다. 를 사용할 수 있지만 IFS
이 경우 중간 변수는 어쨌든 최선의 아이디어는 아닙니다.
사람들은 이 해킹에 움츠러들겠지만, 병적인 파일 이름이 없어도 작동할 것입니다. 당신이 할 수 있는 일은 파일 이름을 변수에 저장하기 전에 강제로 확장하는 것입니다.
FILE="$(echo ../"$1"/*.txt)"
이제 별표가 실제 파일 이름으로 바뀌고 나중에 인용된 버전을 사용하여 "$FILE"
공백을 보호할 수 있지만 별표는 사라집니다.
해당 이름을 가진 파일이 없으면 이 작업은 실패하고 별표는 변경되지 않은 상태로 유지됩니다( nullglob
bash 옵션을 설정하지 않는 한). txt 파일이 여러 개인 경우에도 작동하지 않습니다. 그러나 이것은 항상 작동합니다
for FILE in ../"$1"/*.txt; do whatever you want to do with `"$FILE"`; done