そのため、チュートリアルでお知らせしたとおりに正確に行ったが、まだ動作しない問題があります。
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の一般的なチュートリアルであり、シェルスクリプトに関するほんのいくつかだけを含んでいます。 :)