programing

디렉토리의 파일을 루프 오버하고 경로를 변경하고 파일 이름에 접미사를 추가하는 방법

telebox 2023. 4. 17. 21:41
반응형

디렉토리의 파일을 루프 오버하고 경로를 변경하고 파일 이름에 접미사를 추가하는 방법

다른 인수로 프로그램을 시작하는 스크립트를 작성해야 합니다.프로그램을 시작하는 방법:

./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

반응형