Bash 스크립트는 디렉터리의 모든 파일을 읽고 명령줄 인수에 사용할 문자열에 파일 이름을 추가합니다.

Bash 스크립트는 디렉터리의 모든 파일을 읽고 명령줄 인수에 사용할 문자열에 파일 이름을 추가합니다.

다음을 수행하는 bash 스크립트가 있습니다.

java -jar executablefile.jar --width 100 --speed 50 --ouput outfile.mp4 --input file1.dat file2.dat file3.dat (etc)

다음과 같이 디렉토리의 모든 파일을 읽을 수 있습니다.

dir=~/location/to/files
for f in "$dir"/*; do
   echo "$f"
done

위 테스트에서는 모든 파일을 보여줍니다. 이렇게 하면 한 번에 하나의 파일을 $f에 넣을 수 있습니다. 하지만 각 파일 이름 문자열(제가 믿는 경로 포함)을 다음과 같이 사용할 수 있는 변수로 연결하려면(아마 해당 루프 내에서) 필요합니다.

java -jar executablefile.jar --width 100 --speed 50 --ouput outfile.mp4 --input $listOfFileNamesWithSpaceBetweenEachFile 나는 내 인생에서 이런 것을 결코 찾지 못할 것입니다. 누구든지 어떤 제안이 있습니까?

감사해요.

고쳐 쓰다 대화를 나눈 후 내가 조금 틀렸다는 것이 밝혀졌습니다. 다음과 같아야 합니다.

-- input /path/to/filename1.gpx --input /path/to/filename2.gpx --input /path/to/filename3.gpx etc

그래서 다음을 통해 문자열을 얻을 수 있습니다.

VAR=""
dir=~/location/to/files
for f in "$dir"/*; do
    echo ${f}
    VAR+="--input ${f} "
done
`

모두의 도움에 감사드립니다!

답변1

쉘 명령줄에서 이 명령을 실행하는 경우:

somecommand --input file1.dat file2.dat file3.dat 

그러면 somecommand4개의 매개변수 --input와 3개의 파일 이름이 표시됩니다. 너도 똑같은 일을 할 수 있어

somecommand --input file*.dat

glob은 file*.dat각각 별도의 인수를 갖는 파일 이름 목록으로 확장됩니다 somecommand.

그래서,

java ... --input ~/location/to/files/*

그것이 당신이 해야 할 전부일 수도 있고 아닐 수도 있습니다.


이제 이와 같은 변수를 var="foo.txt bar.txt"따옴표 없이 사용하여 형편없는 목록으로 사용할 수 있지만 일부 파일 이름에 공백이 포함되거나 더 나쁜 경우 문제가 발생할 수 있습니다.

대신 배열을 사용하세요.

files=(foo.txt bar.txt)
somecommand --input "${files[@]}"

또는

files=(foo*.txt) # expands each filename to a distinct array element.
somecommand --input "${files[@]}"

바라보다변수에 저장된 명령을 어떻게 실행할 수 있나요?추가 세부정보가 포함되어 있습니다. 점진적으로 배열을 구축합니다.


편집에서 --input file1 --input file2 ...매개변수가 포함된 명령줄 옵션이 작동하는 방식과 같이 명령을 변경해야 한다고 말씀하셨습니다.

이 경우 다음과 같이 배열에 매개변수를 작성해야 합니다.

args=()
dir=~/location/to/files
for f in "$dir"/*; do
   args+=(--input "$f")
done

그리고 다시 명령어를 실행해 보세요

somecommand ... "${args[@]}"

관련 정보