私は疑問に思っています-特定のディレクトリ内のファイルを除くディレクトリ内のすべてのファイルを移動するにはどうすればよいですか(「mv」には「--exclude」オプションがないため)?
Dir構造が次のようであると仮定しましょう。
|parent
|--child1
|--child2
|--grandChild1
|--grandChild2
|--grandChild3
|--grandChild4
|--grandChild5
|--grandChild6
そして、次のように見えるようにファイルを移動する必要があります。
|parent
|--child1
| |--grandChild1
| |--grandChild2
| |--grandChild3
| |--grandChild4
| |--grandChild5
| |--grandChild6
|--child2
この場合、2つのディレクトリchild1
およびchild2
を除外し、残りのディレクトリをchild1
ディレクトリに移動する必要があります。
つかいます、
mv !(child1|child2) child1
これにより、残りのすべてのディレクトリがchild1
ディレクトリに移動します。
Findにはexcludeオプションがあるため、find + xargs + mvを使用します。
find /source/directory -name ignore-directory-name -Prune -print0 | xargs -0 mv --target-directory=/target/directory
これは、find manページからほとんどコピーされていることに注意してください(mv --target-directoryを使用する方がcpioよりも優れていると思います)。
これはまさにあなたが求めたものではありませんが、それは仕事をするかもしれません:
mv the-folder-you-want-to-exclude somewhere-outside-of-the-main-tree
mv the-tree where-you-want-it
mv the-excluded-folder original-location
(本質的に、移動する大きなツリーから除外フォルダーを移動します。)
したがって、a/
と除外したいa/b/c/*
:
mv a/b/c ../c
mv a final_destination
mkdir -p a/b
mv ../c a/b/c
またはそのようなもの。そうでなければ、あなたはfind
を手に入れることができるかもしれません。
これにより、。/ exclude /ディレクトリにない現在のディレクトリ以下のすべてのファイルが/ wherever ...に移動します。
find -E . -not -type d -and -not -regex '\./exclude/.*' -exec echo mv {} /wherever \;
#!/bin/bash
touch Apple banana carrot dog cherry
mkdir fruit
F="Apple banana carrot dog cherry"
mv ${F/dog/} fruit
#これにより、リストOFから「犬」が削除されるため、現在のディレクトリに残り、「フルーツ」に移動しません
ls | grep -v exclude-dir | xargs -t -I '{}' mv {} exclude-dir