bash에서 이름이 지정되지 않은 파일을 찾는 방법은 무엇입니까? [폐쇄]

bash에서 이름이 지정되지 않은 파일을 찾는 방법은 무엇입니까? [폐쇄]

내 서버에 파일을 쉽게 업로드하는 다음과 같은 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"공백을 보호할 수 있지만 별표는 사라집니다.

해당 이름을 가진 파일이 없으면 이 작업은 실패하고 별표는 변경되지 않은 상태로 유지됩니다( nullglobbash 옵션을 설정하지 않는 한). txt 파일이 여러 개인 경우에도 작동하지 않습니다. 그러나 이것은 항상 작동합니다

for FILE in ../"$1"/*.txt; do whatever you want to do with `"$FILE"`; done

관련 정보