私がディレクトリを整理しているとしましょう。次のようになります。
.
├── file_a.adoc
├── file_a.c
├── file_a.py
├── file_b.adoc
├── file_b.c
├── file_b.py
├── file_c.adoc
├── file_c.c
└── file_c.py
今私はこの時点にいます:
.
├── a
│ ├── file_a.adoc
│ ├── file_a.c
│ └── file_a.py
├── b
│ ├── file_b.adoc
│ ├── file_b.c
│ └── file_b.py
├── c
├── file_c.adoc
├── file_c.c
└── file_c.py
ディレクトリ以外のファイルをすべて dir c に移動するコマンドが必要です。
この例では、以下を使用できます。
mv *_c* c
ただし、より現実的なシナリオでは、把握するのに良いパターンがないか、パターンの識別に興味がない可能性があります。
答え1
1つのアプローチは、「ファイルのすべての内容をcに移動する」を文字通り翻訳することです。
for f in *; do if [ -f "$f" ]; then mv "$f" c; fi; done
あるいは、if-thenの冗長さを避けてください。
for f in *; do [ -f "$f" ] && mv "$f" c; done
より良いことは、set -e
シェルで失敗しないことです。
for f in *; do [ -f "$f" ] && mv "$f" c || true; done
私はタスクの1つが失敗した場合にのみ失敗することを好みます。
for f in *; do [ ! -f "$f" ] || mv "$f" c; done
文字通り:すべてのfに対してファイルではないか、cに移動または中断されます。
答え2
zsh
シェルの使用:
mv -- *(.) c
これはワイルドカードパターンを拡張します*
が、ワイルドカード修飾子(.)
は通常のファイルの名前のみを含むようにフィルタリングします。その後、コマンドを発行してmv
すべてc
のディレクトリに移動します。
シェルでない場合zsh
:
zsh -c 'mv -- *(.) c'
(.)
通常のファイルの名前のみを選択するためにワイルドカードを使用する代わりに、文字通り「非ディレクトリ」を意味する名前を使用できます。(^/)
違いは、*(^/)
シンボリックリンクと他の非ディレクトリファイルタイプの名前とも一致できることです。
答え3
for i in a b c; do
mkdir "$i" # use -p if you need it
find . -type f -name "*_$i.*" -exec mv -t "$i" {} + # or, mv {} "$i" \;
done