한 디렉토리에 파일 목록이 있고 다른 디렉토리의 각 파일에 해당하는 jpeg 세트가 있습니다. 모든 파일을 반복해서 살펴보고 각 파일 이름에 대한 대상 디렉터리를 결정해야 합니다.
예를 들어, 및 in이라는 foo.txt
이름 의 텍스트 파일이 세 개 있는 경우 해당 jpeg는 및 에 있습니다 .bar.txt
baz.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
.