私が犯した愚かなミスは、オーディオコレクションの一部を失った。 :-(
最近のバックアップがあって幸いですが、まだ面倒です。実際のバックアップに加えて、別のいたずらの原因は、次のようにmv
表示されることです。
オーディオファイルには特定のスキームがあります。
ARTIST - Some Title YY.mp3
YY
2桁の年仕様はどこにありますか?
mkdir 90<invisible control character>
(これまでは目に見えない追加文字の3分の1を実際に入力していることを全く知りませんでした…!) すべてを
一つのディレクトリに入れる代わりに、90年代の音楽をすべて一つのディレクトリに入れたいと思いました。だから私は次のように入力します:
find . -name '* 9?.mp3' -exec mv {} 90 \;
何が起こっているのか理解するのは難しくありませんか? :->
(悲劇的な)結果は処女でした。空「90」というディレクトリ何'(そして何「見えない」制御文字です)とファイル「90」と呼ばれるN移流。
すべてのファイルが消えた。 :-(((確かに)
mv
それを望む確認済み時間内にターゲット「ファイル」が署名されているかどうか(* NIXで記憶:すべてがファイルですd------
)は(例えば)で始まりますdrwxr-xr-x
。もちろん目的地に関係なく存在する別言します。単に次の場合、上記のシナリオにバリエーションがあります。忘れるまずmkdir
ディレクトリに移動します。 (もちろんそこにいると仮定しますが…)
私たちが嫌いなオペレーティングシステムも大文字で始まります。ワットはい。あなたは均等化することができますヒント必要に応じて、ターゲットタイプ(ファイル?ディレクトリ?)を指定します。
mv
だから私たちの* NIXユーザーがこれらの最小限の驚きを避けるためにまだ「スクリプトレット」を書く必要があるかどうか疑問に思います。
答え1
/
ファイルをディレクトリに移動するには、ターゲットの場所にを追加します。ディレクトリが存在しない場合、次のエラーが発生します。
mv somefile somedir/
mv: cannot move ‘somefile’ to ‘somedir/’: Not a directory
ディレクトリが存在する場合は、ファイルをそのディレクトリに移動します。
答え2
GNU coreutilsmv
には、移動するディレクトリを指定するオプション(-t
/)が既にあります--target-directory
。このオプションの引数が存在しない場合、mv
すべてのファイルを同じファイル名に移動するのではなく、エラーが発生します。
私はあなたのポーターに次のように書きます:
find . -name '* 9?.mp3' -exec mv -t 90 {} +
+
置換を使用すると、\;
実行を高速化するためにできるだけ多くのファイル名を結合します。
答え3
また、一般的に将来の偶発的な保証を防止する予定の場合は、個人的に-i
次のオプションがあります。mv
alias mv='mv -i'
何かをオーバーライドする必要がある場合は、その-f
オプションを渡すだけです。
エイリアスは、対話型シェルに直接コマンドを入力する場合にのみ適用されますが、viaの場合はfind
。
find . -name '* 9?.mp3' -exec mv -i {} 90 \;
mv
これにより、既存のファイルを上書きするかどうかを尋ねるメッセージが表示されます。
答え4
代替の一般戦略として、このタスクを一時スクリプトに切り替えることをお勧めします。私は結果を見て、手動でコマンドfind
に変換してmv
実行する前に何をしているのかを理解することを好みます。例えば。
find . -name '* 9?.mp3' > tmp
vim tmp
これで、ファイル名のリストを表示し、ファイルの内容をシェルコマンドで書き換えることができます。
- ファイルの内容を1行に入力してください。
ggVGJ
- プレフィックス:
Imv
[esc]
- 追加:
Asomedir/
[esc]
- 文書を保存します。もう一度読んでください。息をしてください。
source tmp
コマンドラインから実行されます。
これは保守的な戦略ですが、コマンドを誤って入力し-exec
たり、sed
シェル拡張を誤解したりすることが多いため、遅くて一貫したアプローチを好みます。
つまり、私はそれを使用するにはあまりにも心配です-exec
。