내 파일에는 dir1.txt
다음 디렉터리의 이름이 포함되어 있습니다.
2
3
4
디렉터리 2에는 2_1.txt 및 2_2.txt 파일이 포함되어 있습니다.
디렉터리 3에는 3_1.txt 및 3_2.txt 파일이 포함되어 있습니다.
디렉터리 4에는 4_1.txt 및 4_2.txt 파일이 포함되어 있습니다
. 각 파일에는 두 줄이 포함되어 있습니다.
그런 다음 다음과 같은 중첩 루프를 만들었습니다.
#!/bin/bash
input="dir1.txt"
while IFS=read -r line
do
for j in "$line/*"
do sed -e '$s/$/\n/' $j
#cat $j; echo
done >> output.txt
done < "$input"
기본적으로 연결된 파일 사이에 빈 줄을 두고 싶습니다. 위 루프를 사용하면 dir 2의 마지막 파일 내용과 dir 3의 첫 번째 파일, 그리고 dir 3의 마지막 파일 내용과 dir 4의 첫 번째 파일 사이에 빈 줄만 표시됩니다. 사이에 빈 줄이 있지만, 또한 동일한 디렉터리에 있는 파일의 연결된 내용 사이에 빈 줄을 추가하고 싶습니다. 나는 cat $j; echo (위의 설명)를 사용해 보았지만 소용이 없었습니다. 중첩된 for 루프를 사용하여 다시 시도했는데 동일한 결과를 얻었습니다. 내 논리가 잘못된 것 같아요.
답변1
귀하의 논리는 정확하지만 작동하려면 몇 가지 수정이 필요했습니다.
- 이후에 누락된 공백이 추가되었습니다
IFS
(그렇지 않으면 오류 발생). - 참조를 (else )
"$line/*"
로 변경합니다."$line"/*
sed: can't read 2/*: No such file or directory
- 인용문
$j
(더 나은 스타일을 위해)
sed
두 버전 모두 cat/echo
원래 해야 할 작업을 수행합니다.
#!/bin/bash
input="dir1.txt"
while IFS= read -r line
do
for j in "$line"/*
do
sed -e '$s/$/\n/' "$j"
#cat "$j"; echo
done >> output.txt
done < "$input"
답변2
의심스러운 경우 주석과 stderr 출력을 사용하십시오.
또한 스크립트의 일부 측면이 GNU bash 버전 4.2.46(2) 릴리스(x86_64-redhat-linux-gnu)에서 작동하지 않습니다.
#!/bin/bash
input=dir1.txt
# Cycle through input
for dir in $(cat $input)
do
# Prints to stderr
(echo "INFO - Dir: $dir" 1>&2)
# Is dir a directory?
if [ -d $dir ]
then
# Cycle through files
for file in $dir/*
do
# Prints to stderr
(echo "INFO - File: $file" 1>&2)
# Print contents
cat $file
# Blank line.
echo
done
fi
done >> output.txt