ディレクトリ以外のファイルのみを移動する方法

ディレクトリ以外のファイルのみを移動する方法

私がディレクトリを整理しているとしましょう。次のようになります。

.
├── 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

関連情報