특정 파일을 찾아 폴더로 이동하는 쉘 스크립트를 작성하려고 합니다.
#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read text2
while :
do
echo -n "Ara:"
read text1
b=$(find /home/cosmoretro 2>/dev/null -iname "$text1"*)
IFS=$'\n'
mv $b /home/cosmoretro/movie/"$text2"
done
하지만 검색한 폴더와 동일한 파일이 있으면 파일도 이동합니다.
내가 원하는 것은 폴더 이동뿐입니다.
답변1
나는 이 대본을 읽는 것조차 힘들다. 조금 다시 작성해 보도록 제안해도 될까요?
#!/bin/sh
echo -n "/home/cosmoretro/movie/"
read destinationFileName
while :
do
echo -n "Ara:"
read sourceFileName
sourceFile=$(find /home/cosmoretro -type d -iname "$sourceFileName" -print -quit 2> /dev/null)
if [[ -z $sourceFile ]]; then
echo "No file named $sourceFileName found"
else
mv -- "$sourceFile" /home/cosmoretro/movie/"$destinationFileName"
fi
done
내가 한 것:
destinationFileName
대신에 다음과 같은 설명적인 이름을 사용하십시오 .text2
- 적절하게 들여쓰기
find
를 지정하여 디렉토리만 찾도록 하십시오-type d
. 파일만 이동하려면-type f
대신 를 사용하세요-type d
.- 중요하지 않으므로 리디렉션을 명령 끝으로 이동하십시오.
- 첫 번째 파일( )
find
을 찾은 후 중지합니다 .-quit
*
명령 에서 불필요한 항목을 제거하십시오find
. 거기에서 무엇을 원하는지 확실하지 않습니다. 파일 이름에 와일드카드를 사용하려는 경우(예: 검색하면foo
returnfoobar
) 와일드카드를 입력해야 합니다.~ 안으로따옴표, 즉"$sourceFileName*"
.-z
결과가 비어 있으면 테스트를 통해 파일이 전혀 발견되었는지 확인합니다 .- 옵션 끝 옵션을 사용하여
mv
다음으로 시작하는 파일 이름으로부터 보호하세요 .-
--
- 공백으로 인해 명령이 중단되는 것을 방지하려면 인수를 적절하게 인용하십시오(그렇다면 변경할 필요 없음
IFS
).