ファイルを同じディレクトリにまとめてダンプする間違いを犯しました。幸い、ファイル名でソートできます。 2019-02-19 20.18.58.ndpi_2_2688_2240.jpg ''#ビットまたは2この特別な場合には、いわば位置情報です。範囲は0から9で、ファイル名の長さはすべて同じであるため、数字は常にファイル名の同じ場所にあります(スペースを含む26文字、横にアンダースコア付き)。私は次のような素晴らしいリンクを見つけました: ファイル名の一部だけを検索してファイルを検索するコマンド?
ただし、出力をmoveコマンドにパイプすることはできません。出力を変数として繰り返そうとしましたが、そのうちの1つも機能しないようです。
for f in find . -name '*_0_*' ; do mv "$f" /destination/directory ; done
このリンクによると、*または一部の引用符が間違った場所に置かれている可能性があります。mv:セルスクリプトには対応するファイルまたはディレクトリがありません。。
つまり、多くのディレクトリがあり、それを他の場所でも同じディレクトリ構造にソートしたいと思います。
-Flowers (to be sorted) -Flowers-buds -Flowers-stems
-Roses -Roses -Roses
buds.jpg ===> buds.jpg ===> stems.jpg
stems.jpg
petals.jpg
-Daisies -Daisies -Daisies
buds.jpgs buds.jpg stems.jpg
stems.jpg
petals.jpg
-Tulips -Tulips -Tulip
buds.jpgs buds.jpg stems.jpg
stems.jpg
petals.jpg
...そしてその数字による追加情報(#)。これは実際にbashで行われることですか?私はcoreutilsがインストールされている端末でMacOSを実行しているので、ツールはdarwin(BSD)ではなくGNU linuxのように動作するはずです。
ベストアンサー1
and を使用してこれを実行できますが、find
最もmv
簡単な方法ではありません。 macOSを使っているので扱いにくいすでにプレインストールされています。 Zshには、次のようなきちんとしたファイルの一括名前変更ツールが付属しています。zmv
。zsh
端末で実行した後、zshで次のコマンドを実行します。
autoload zmv
zmv -n '[^_]#_([0-9])_*' '/elsewhere/${1}/${f}'
説明する:
-n
zmv
何をするのかを見せてくれと言いますが、実際には何もしません。表示される内容に満足したら、コマンドを再実行してください(-n
。- オプションではない最初のパラメーターは次のとおりです。ワイルドカードパターン。
zmv
一致するファイルに対して操作を実行します(一致しないファイルは無視されます)。 [^_]#
除いて、ゼロ個以上の文字を表します_
。 Zshはbashと同じワイルドカードなどへのアクセスを提供します。#
「前の文字数制限なし」を意味する zsh 専用機能 (bash の他の構文として使用可能)。このパターンは、[^_]#_[0-9]_*
2つの下線の間に単一の数字が含まれ、その数字の前に他の下線がないすべてのファイル名と一致します。- 角かっこで囲むと、代替テキストで
[0-9]
その番号を使用できます。$1
${1}
代替テキストは、などを使用して${2}
ソーススキーマの括弧で囲まれた部分を参照し、完全な元の${f}
名前を参照できます。
たとえば、上記のコードスニペットは2019-02-19 20.18.58.ndpi_2_2688_2240.jpg
に移動します/elsewhere/2/2019-02-19 20.18.58.ndpi_2_2688_2240.jpg
。あなたの質問は何を動かすべきか、どこに行くべきかは非常に正確には説明されていませんが、上記のコマンドを調整することであなたが望むものを得ることができます。わからない場合は、質問を編集して、一致する必要がある項目と一致しない項目の具体的な例を追加してください。
サブディレクトリにファイルがある場合は、パターンの先頭に使用できます*/
。参照するためにディレクトリを一致させる必要がある場合は、::の周りに括弧を入れる必要があります。スラッシュの周りに括弧を入れることはできません。ディレクトリを再帰的に移動し、ファイルを借金と照合するには、次のようにします。${NUM}
*
**/
再帰ワイルドカード。例外的に代替(**/)
テキストのディレクトリパスにアクセスするには、を使用する必要があります。この場合、括弧を使用せずにかっこを使用する方が簡単です。${NUM}
修飾子${f}
元のパスの一部を完全に抽出します。たとえば、上記と同じ名前変更を実行しますが、ファイルを現在のディレクトリから次の並列構造に移動しますが、ファイル名の前に追加/elsewhere
レベルを追加する0
などの操作を実行します。1
autoload zmv
zmv -n '**/[^_]#_([0-9])_*' '/elsewhere/${f:h}/${1}/${f:t}'
名前に基づいてファイルを照合することが困難な場合は、変更時間に基づいてファイルを照合する別のアプローチがあります。しばらく変更されていないディレクトリに複数のファイルをコピーすると、新しいファイルは最後に変更されたファイルになります。 zshで変更時間ごとにファイルを一致させることができますグローバル予選c
。たとえば、過去1時間に最後に変更されたファイルを一覧表示するには、次のようにします。
ls -lctr *(ch-1)
あなたは参照することができます窒素glob修飾子を使用して最近変更されたファイルoc
(ctimeを増やしてソート)と(最初のファイルのみを保持)[1,N]
窒素マッチ)。たとえば、42個のファイルをこのディレクトリに移動し、それ以降何も変更しなかったことを知っているとします。
ls -lctr *(oc[1,42])
でglob修飾子を使用するには、zmv
このオプションを渡す必要があります-Q
。たとえば、ファイル名(上記に示す)に基づいてディレクトリにファイルを移動しますが、過去1時間に変更されていないファイルは無視されます。
zmv -n -Q '[^_]#_([0-9])_*(ch-1)' '/elsewhere/${1}/${f}'
zmv
ファイルを上書きせずに競合がないことを確認するいくつかの安全装置があります(両方のソースファイルのターゲット名が同じです)。ファイル数が多い場合、これらのセキュリティ対策に時間がかかることがあります。速度zmv
が遅すぎて名前が変更された構造によって競合が発生しない場合は、ループで行われた特定の名前の変更をハードコードできます。 Zshを使用しなくても、bashがzmv
良いので、勝つ傾向があります。ワイルドカードそしてパラメータ拡張器具。パフォーマンスのために、次のことができます。動的ローディングモジュールには以下が含まれます。ファイルを操作するための組み込み機能。
たとえば、名前に次のものが含まれている場合は、通常のファイルを現在のディレクトリからまったく新しい階層に移動します_0_
。
zmodload -m -F zsh/files 'b:zf_*'
for x in **/*_0_*(.); do
zf_mkdir -p /destination/directory/$x:h
zf_mv ./$x /destination/directory/$x
done
(:h
これはzshのもう一つの機能です:履歴修飾子.)
ファイル名から2つの下線の間の最初の数字を取得し、その数字の名前を付けたディレクトリにファイルを保存するには、その数字を抽出する必要があります。zmv
これは括弧で囲まれたグループに対して自動的に行われますが、ここでは手動で行う必要があります。
zmodload -m -F zsh/files 'b:zf_*'
for source in **/*_<->_*(.); do
suffix=${${source:t}#*_<->_}
n=${${source%$suffix}##*_}
destination=${source:h}/$n/${source:t}
zf_mkdir -p /destination/directory/$destination:h
zf_mv ./$source /destination/directory/$destination
done
ファイル名を一括で変更する別の方法を知りたい場合は、次を参照してください。rename
このサイトにタグ付けされた質問。
¹ファイルのinode変更時間(「変更時間」または「ctime」とも呼ばれる)は、ファイルが最後に移動された時間、またはその属性(権限など)が最後に変更された時間です。修正時間(mtime)とは異なります。