텍스트 파일 쉘 스크립트의 루프

텍스트 파일 쉘 스크립트의 루프

한 디렉토리에 파일 목록이 있고 다른 디렉토리의 각 파일에 해당하는 jpeg 세트가 있습니다. 모든 파일을 반복해서 살펴보고 각 파일 이름에 대한 대상 디렉터리를 결정해야 합니다.

예를 들어, 및 in이라는 foo.txt이름 의 텍스트 파일이 세 개 있는 경우 해당 jpeg는 및 에 있습니다 .bar.txtbaz.txt/home/userA/folder//home/userA/folder2/foo//home/userA/folder2/bar//home/userA/folder2/baz/

모든 txt 파일을 반복하여 해당 대상 디렉터리를 가져오는 스크립트를 작성했지만 오류가 발생합니다.

bash: /home/userA/folder/File1.txt: syntax error: operand expected (error token is "/home/userA/folder/File1.txt")`

내 스크립트:

#!/bin/bash
FILES=/home/userA/folder/*.txt
for i in $FILES
do
    str1=$i | cut -d'/' -f5 #to get the name of the file
    echo /home/userA/folder2/$i_filename #I want to include the .txt filename in the output to be like this /home/userA/folder2/Text1_filename    
done

이 문제를 어떻게 해결할 수 있나요?

답변1

원하는 것이 파일 이름을 얻고 이를 사용하여 올바른 대상 디렉토리를 얻는 것이라면 다음을 수행할 수 있습니다.

#!/bin/bash
for i in /home/userA/folder/*.txt
do
    ## Get the file name
    str1="${i##*/}"

    ## Get the target directory
    dir="/home/userA/folder2/${str1%.txt}/"
done

이것은 쉘을 사용하는 기본입니다.문자열 연산특징. ${var##pattern}가장 긴 일치 항목은 의 시작 부분에서 제거되고 가장 짧은 일치 항목은 의 끝 부분에서 제거됩니다. 따라서 파일 이름에서 마지막 (경로)까지 모든 것을 제거하고 끝에서 문자열을 제거하십시오.pattern$var${var%pattern}pattern$var${i##*/}/${i%.txt}.txt

답변2

사용 find:

#!/bin/bash
path="/home/userA/folder"
find "$path" -maxdepth 1 -type f -name "*.txt" -print0 | while read -d $'\0' file; do
    a="$path/$(basename $file)/a_%06.jpg"
    echo "$a
done

답변3

echo이 줄의 백틱과 필드 번호를 잊어버렸습니다.

    str1=`echo $i | cut -d'/' -f5 `#to get the name of the file

하지만 basename그게 더 나은 선택일 수도 있다.

    str1=`basename $i` #name of the file

이와 같이

#!/bin/bash
FILES=/home/userA/folder/*.txt
for i in $FILES
do
    str1=`basename "$i"` #to get the name of the file
    echo $str1
    ls -l "`dirname "$i"`/$str1"
done

for 루프와 이름에 공백이 있는 파일 처리에 대한 좋은 대답은 다음을 참조하세요.이 답변

답변4

실제로 변수에 넣으려면 bash 배열을 사용할 수 있습니다.

#!/bin/bash
FILES=(/home/userA/folder/*.txt)
for i in "${FILES[@]}" # double qouting pervents extra word splitting
do
    bn="$(basename "$i")" # to get the name of the file
    a="/home/userA/folder2/$bn/a_%06d.jpg"
done

아니면 간단히 for i in /home/userA/folder/*.txt.

관련 정보