디렉토리의 파일을 루프 오버하고 경로를 변경하고 파일 이름에 접미사를 추가하는 방법
다른 인수로 프로그램을 시작하는 스크립트를 작성해야 합니다.프로그램을 시작하는 방법:
./MyProgram.exe Data/data1.txt [Logs/data1_Log.txt]
.
다음에, 실행하는 의사 코드를 나타냅니다.
for each filename in /Data do
for int i = 0, i = 3, i++
./MyProgram.exe Data/filename.txt Logs/filename_Log{i}.txt
end for
end for
첫 번째 인수에서 두 번째 인수를 생성하여 데이터처럼 보이게 하려면 어떻게 해야 합니까?ABCD_Log1.txt로 프로그램을 시작하시겠습니까?
먼저 몇 가지 주의사항:Data/data1.txt
의론으로서, 정말 그렇다면/Data/data1.txt
(선두 슬래시 포함)또한 외부 루프에서 .txt 파일만 스캔해야 합니까, 아니면 /Data의 모든 파일을 스캔해야 합니까?여기 답이 있습니다./Data/data1.txt
및 .txt 파일만:
#!/bin/bash
for filename in /Data/*.txt; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$filename" "Logs/$(basename "$filename" .txt)_Log$i.txt"
done
done
주의:
/Data/*.txt
/Data(/Data/ 부분 포함)에 있는 텍스트 파일의 경로로 확장합니다.$( ... )
셸 명령어를 실행하여 명령줄의 해당 지점에 출력을 삽입합니다.basename somepath .txt
는 .txt를 끝에서 삭제한 일부 경로의 기본 부분을 출력합니다(예:/Data/file.txt
->file
)
My Program을 실행할 필요가 있는 경우Data/file.txt
대신/Data/file.txt
,사용하다"${filename#/}"
선두 슬래시를 제거합니다.반면에, 만약 그게 정말Data
것은 아니다./Data
스캔하고 싶다면for filename in Data/*.txt
.
Globing을 통해 파일을 반복할 때는 Glob이 일치하지 않는 코너 케이스(루프 변수가 (일치하지 않는) Glob 패턴 문자열 자체까지 확장됨)를 피하는 것이 좋습니다.
예를 들어 다음과 같습니다.
for filename in Data/*.txt; do
[ -e "$filename" ] || continue
# ... rest of the loop body
done
레퍼런스:배쉬 함정
for file in Data/*.txt
do
for ((i = 0; i < 3; i++))
do
name=${file##*/}
base=${name%.txt}
./MyProgram.exe "$file" Logs/"${base}_Log$i.txt"
done
done
그name=${file##*/}
substitution(셸 파라미터 확장)은 마지막까지 선행 경로 이름을 삭제합니다./
.
그base=${name%.txt}
치환으로 후행 제거.txt
. 확장자가 다를 수 있다면 조금 더 까다롭습니다.
find의 null 구분 출력 옵션을 read와 함께 사용하면 디렉토리 구조에서 안전하게 반복할 수 있습니다.
#!/bin/bash
find . -type f -print0 | while IFS= read -r -d $'\0' file;
do echo "$file" ;
done
그래서 당신의 경우,
#!/bin/bash
find . -maxdepth 1 -type f -print0 | while IFS= read -r -d $'\0' file; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$file" 'Logs/'"`basename "$file"`""$i"'.txt'
done
done
또한.
#!/bin/bash
while IFS= read -r -d $'\0' file; do
for ((i=0; i<=3; i++)); do
./MyProgram.exe "$file" 'Logs/'"`basename "$file"`""$i"'.txt'
done
done < <(find . -maxdepth 1 -type f -print0)
는 스크립트(프로세스)의 현재 범위에서 while 루프를 실행하여 필요에 따라 변수 설정에 find 출력을 사용할 수 있도록 합니다.
각 파일에 대해 다음 명령을 실행합니다.
모든 .txt 파일로 작업(에코)을 수행합니다.
for f in *.txt; do echo ${f}; done;
Windows 파일(.exe)을 실행하려고 하는 것 같습니다.당연히 PowerShell을 사용해야 합니다.어쨌든 Linux Bash 쉘에서는 간단한 원라이너로 충분합니다.
[/home/$] for filename in /Data/*.txt; do for i in {0..3}; do ./MyProgam.exe Data/filenameLogs/$filename_log$i.txt; done done
또는 Bash 스크립트:
#!/bin/bash
for filename in /Data/*.txt;
do
for i in {0..3};
do ./MyProgam.exe Data/filename.txt Logs/$filename_log$i.txt;
done
done
언급URL : https://stackoverflow.com/questions/20796200/how-to-loop-over-files-in-directory-and-change-path-and-add-suffix-to-filename
'programing' 카테고리의 다른 글
XAML에서 변수를 정의하려면 어떻게 해야 하나요? (0) | 2023.04.17 |
---|---|
오브젝트 내의 속성별로 목록을 정렬하는 방법 (0) | 2023.04.17 |
Xcode 4는 "Attaching to (app name)"에 행업합니다. (0) | 2023.04.17 |
bash에서 명령어를 N번 실행하는 더 좋은 방법이 있나요? (0) | 2023.04.17 |
5행부터 시작하여 헤더를 포함한 python 데이터 프레임에 대한 읽기 성능 향상 (0) | 2023.04.17 |