이 스크립트는 모든 파일을 모든 폴더에 복사합니다. 하지만 각 파일이 복사될 폴더를 지정하는 조건문을 작성하는 데 어려움을 겪고 있습니다. if 문을 시도했지만 전혀 복사되지 않습니다.
매개 변수 확장을 사용하는 이유는 파일 이름이 Long_John_Silver, Miss_Havisham, Master_Pip과 같고 폴더 이름이 Long, Miss, Master와 같기 때문입니다. 따라서 기본적으로 파일을 해당 폴더에 복사하려고 합니다. 예를 들어 Master_Pip.fna.gz를 Master라는 폴더에 복사하려고 합니다. 그래서 제가 하려는 것은 파일 이름의 첫 번째 단어를 캡처하여 어떻게든 참조로 사용하는 것입니다.
for fldr in /home/scripts/playground/genomes_2/* ; do
find . -name *fna.gz | while read f ; do
basenm=${fldr##*/} ; f_name=${basenm%%_*} ;
cp -r $f /home/scripts/playground/port/$f_name/ ;
done
done
여기에 if 문이 포함된 스크립트가 있지만 스크립트는 아무것도 복사하지 않습니다.
for fldr in /home/scripts/playground/genomes_2/* ; do
find . -name *fna.gz | while read f ; do
basenm=${fldr##*/} ; f_name=${basenm%%_*} ;
if [ "$f_name" == /home/scripts/playground/port/"$f_name" ] ; then
cp -r $f /home/scripts/playground/port/"$f_name"/ ;
else
continue
fi
done
done
답변1
1.이 코드를 변경하세요
basenm=${fldr##*/};
이에
basenm=${f##*/} ;
복사 명령에서 -r 스위치를 제거하십시오.
cp $f /home/scripts/playground/port/"$f_name"
어쩌면 /home/scripts/playground/genomes_2/Long_John_Silver/Master_Pip.fna.gz와 같은 혼란스러운 소스 경로가 있을 수도 있습니다. 따라서 폴더 이름에서 f_name을 추출하면 fldr
"long"이 표시됩니다. 그런 다음 Master_Pip.fna.gz를..../Long 폴더에 복사합니다. 2.
"$f_name" == /home/scripts/playground/port/"$f_name"
그들은 동일하지 않으며 동일하지 않을 것입니다.
기본적으로 첫 번째 스크립트는 괜찮습니다. 조건문은 매개변수 확장을 통해 암시적으로 수행하므로 중복됩니다.
복사하기 전에 디렉터리 생성 명령을 추가하면 됩니다. 이렇게 하면 소스 디렉터리(예: Shorty_Pete)에 새 사람이 나타나는 경우 항상 복사할 디렉터리를 갖게 됩니다.
mkdir -p /home/scripts/playground/port/"$f_name"
cp ...
답변2
파일 형식(예: .fna.gz)을 기준으로 모든 파일을 모든 폴더에 복사한다는 사실을 알고 fna.gz 파일 형식을 지정하여 읽고 복사했습니다. 매개변수 확장을 통해 구체성이 암시되므로 if 문이 필요하지 않습니다. 이제는 잘 작동합니다.
for fldr in /home/scripts/playground/genomes_2/* ; do
basenm=${fldr##*/} ; f_name=${basenm%%_*} ;
find . -name $f_name*fna.gz | while read f ; do
cp -r $f /home/scripts/playground/port/$f_name/ ;
done
done