쉘 스크립트 문제 [닫기]

쉘 스크립트 문제 [닫기]

그래서 튜토리얼에서 알려준 대로 정확하게 수행했지만 여전히 작동하지 않는 문제가 있습니다.

1 #!/bin/bash
2 users=$(ls *.usr)
3 date=$(date +%F)
4 for usr in $users
5 do
6 mv ${usr} ${date}-${users}
7 done

디렉토리의 내용은 다음과 같습니다.

1.sh   fila2  fila6  file3  log1         marty1.usr  marty5.usr  marty9.usr  user3
2.sh   fila3  file0  file4  marty0.usr   marty2.usr  marty6.usr  user0       user4
fila0  fila4  file1  file5  marty10.usr  marty3.usr  marty7.usr  user1       user5
fila1  fila5  file2  file6  marty11.usr  marty4.usr  marty8.usr  user2       user6

이제 내 스크립트는 .usr로 끝나는 모든 파일의 이름을 이름 앞에 날짜가 포함되도록 바꿔야 하지만 대신 다음 오류가 발생합니다.

mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory 
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory
mv: target ‘marty9.usr’ is not a directory

다시 말하지만, 어디에도 marty9.usr이라는 폴더를 생성하라고 요청하지도 않는다는 점을 고려하면 제가 뭘 잘못하고 있는지 전혀 모르겠습니다...

답변1

이것은 당신의 튜토리얼입니다~해야 한다당신에게 말하세요:

#!/bin/bash
date=$(date +%F)
for file in *.usr
do
    echo moving "$file" to "$date-$file"
    mv "$file" "$date-$file"
done

어디

  • ls파일 이름을 반복할 필요가 없습니다.
  • 패턴과 일치하는 파일을 직접 반복합니다.
  • 토큰화 및 파일 이름 확장으로부터 자신을 보호하기 위해 변수를 인용합니다.

답변2

그러니까 분명히 내가 틀렸어

   6 mv ${usr} ${date}-${users}

그랬어야 했어

   6 mv ${usr} ${date}-${usr}

그러나 나는 이것이 왜 작동하는지 아직도 이해하지 못합니다. 나는 usr이 어디에 있는지 스크립트에 말하지 않았습니다. 내가 말하지 않았을 때 usr이 파일 이름이라는 것을 어떻게 알 수 있습니까? "for usr in $users"는 제게는 이해가 되지 않습니다...

그러면 내가 usr 및 $usr이라고 부르더라도 이것이 작동할까요? "banana"와 "$banana"라고 부르면 효과가 있을까요?

네, 바나나라고 불러도 되는군요...왜요? 그렇다면 첫 번째 용어의 목적은 무엇입니까?

솔직히 말해서 이것은 쉘 스크립팅에 대한 튜토리얼이 아니라 Linux에 대한 일반적인 튜토리얼이며 쉘 스크립팅에 대한 몇 가지 내용만 포함하고 있습니다. :)

관련 정보