그래서 튜토리얼에서 알려준 대로 정확하게 수행했지만 여전히 작동하지 않는 문제가 있습니다.
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에 대한 일반적인 튜토리얼이며 쉘 스크립팅에 대한 몇 가지 내용만 포함하고 있습니다. :)