私のディレクトリにいくつかのファイルがあります。 2つのカテゴリに分けることができます。最初のカテゴリのファイル名パターンは、1000-24-1-7-1
4つのダッシュで区切られた5つの数字です。 2番目のカテゴリのファイル名パターンは似ており、abcd-1000-24-1-7-1-efgh-ijkl
ダッシュで区切られていますが、前または後に文字があります。それ。
私の質問は、これらのファイルを自分のディレクトリの最初のカテゴリにあるディレクトリに移動してフィルタリングする方法ですfirst-class
。
答え1
一部のシェルでは、拡張globbing +特定のフラグを使用して一致させることができますクラス1。
そしてbash
:
shopt -s extglob
for one in +([0-9])-+([0-9])-+([0-9])-+([0-9])-+([0-9])
do
[[ -f $one ]] && mv -- "$one" first-class
done
+(<PATTERN>)
指定されたパターンに一致する項目を1つ以上一致させ、[[ -f ... ]]
通常のファイルをテストします。その場合は、mv
-edをfirst-class
実行してください。試運転、echo
前に追加されましたmv
。
そしてzsh
:
setopt extended_glob
mv -t first-class [0-9]##(-[0-9]##)(#c4)(.)
x##
1つ以上のパターン一致を一致させますx
。(#cN)
正確なN
一致が必要で、(.)
ファイルのみ一致する必要があります
。または:
autoload zmv
zmv -Q '[0-9]##(-[0-9]##)(#c4)(.)' first-class
-Q
裸のグローバル修飾子をオンにします。試運転-n
たとえば、追加します。zmv -Qn ...
一般ファイルをフィルタリングする必要がない場合は、テストを選択しないままにしておくことができますbash
。
shopt -s extglob
mv -- +([0-9])-+([0-9])-+([0-9])-+([0-9])-+([0-9]) first-class
(.)
修飾子がない場合zsh
:
setopt extended_glob
mv -t first-class [0-9]##(-[0-9]##)(#c4)
または
autoload zmv
zmv '[0-9]##(-[0-9]##)(#c4)' first-class
答え2
Bjornの解決策はうまくいくようですが、もう1つの可能性は正規表現でfindを使用することです。find -regextype posix-extended -regex '.*/[[:digit:]]{1,}(-[[:digit:]]{1,}){4}$'
その後、-exec mv {} first-class \;
xargsまたは同様のパイプラインまたはパイプラインで使用できます。
答え3
mv [0-9]*-[0-9]*-[0-9]*-[0-9]* first-class
これを行う方法がわかりませんか?