다음을 수행하는 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
그러면 somecommand
4개의 매개변수 --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[@]}"