どのように/名前の変更、特定の拡張子を持つすべてのファイルを移動するには?
質問
私はTCL(期待)を学んだし、今私は興味深い問題になりました。私は、拡張子.statusとファイルの束を名前変更/移動するコマンドを必要としています。私はこれらを試してみました。
spawn /bin/mv *.status some_dir
exec /bin/mv *.status some_dir
もちろん、それは動作しませんでした。私は少しグーグルとグロブについて何かを見つけたが、私はそれがしたいように動作するようには思えません。私が行う場合:
exec /bin/mv [glob *.status] somedir
MV ののは、その '1.status 2.status 3.status ...など。' 文句有効なファイルではありません。このファイルのリスト全体ではなく別々に処理された単一の文字列に連結されているかのように。
壊れたと時代遅れのリンクの多くに私を導くグーグル経由でより多くの情報を見つけるためにしようと、私は横にこの問題を解決望んでいる、あなたは、Tcl /基礎および一般的な落とし穴を期待するために、いくつかの良いオンラインリソースに私を指すことができます。
のアップデート:/ binに標準TCLと標準のツールを使用するの唯一の解決策は受理されます。
。解決
$ ls -1 1.status 2.status rename.tclsh* some_dir/ two words.status $ cat rename.tclsh #!/usr/local/bin/tclsh eval exec /bin/mv [glob *.status] some_dir $ ./rename.tclsh $ ls -1 rename.tclsh* some_dir/ $ ls -1 some_dir/ 1.status 2.status two words.status
他のヒント
ランディの答えは短く、正しいですが、必要としないのexecを使用しています。 ヨセフの答えは非常に堅牢が、少し長いです。
私が使用することになり、短いと慣用的な答えのために(Tclの8.5が必要です):
ファイル名の変更{*} [グロブ* .status] some_dir
proc move_to_dir {filenames dirname} {
foreach filename $filenames {
file rename $filename [file join $dirname [file tail $filename]]
}
}
# Example:
move_to_dir [glob -nocomplain *.status] ~/foo/bar/
このソリューションは、スペースを含む名前のファイルで動作します:
exec find -maxdepth 1 -name *.status -print0 | xargs -0 mv -t some_dir
しかし、それは見つけると/ usr / binに、ない/ binに最も多いxargsの必要があります。
安全機能として、コマンドを「検索」複合体を使用して、潜在的に、私は、コマンドの前に「エコー」固執し、それをファイルにキャプチャしたデータを削除するとき。
私はそれを実行するために、「ソース」を使用する前に、ファイルにリストされたコマンドを確認することができます。
また、ファイルを手動その時々エッジケースを処理する方法です。