以下に示すように、ディレクトリにいくつかのファイル、フォルダ、およびドットファイルがあります。
|-folder1
|----folder2
|----file.json
|----file2.php
|----.env
|----.dockerfile
|----.someconfig
|----.dockerignore
除外するmv $(ls | egrep -v '(.dockerfile|.env)') ../new_directory
ディレクトリ内のすべてのファイルを移動するコマンドを実行しましたが、実際にはすべてのドットファイルを移動することはできません。なぜですか?folder1
new_directory
.dockerfile
.env
答え1
走れば
ls | egrep -v '(.dockerfile|.env)'
それ自体で、ここで何が起こっているのか理解するでしょう。出力は次のとおりです。
file2.php
file.json
folder2
これはls
、デフォルトではドットファイルがリストされていないために発生します。ドットファイルを含めたり.
含めたりしたくない場合は、..
次のようにしますls -A
。
$ ls -A | egrep -v '(.dockerfile|.env)'
.dockerignore
file2.php
file.json
folder2
.someconfig
ls
ここでは使用する必要はありません。あなたはしないでください)、Bash拡張を使用することができますパターンマッチング:
shopt -s extglob dotglob
mv !(.dockerfile|.env|.|..) ../new_directory
これはすべてのファイルと一致します。いいえ.dockerfile
、またはと.env
命名されました。この方法では、スペース、改行などを含むファイル名に問題は発生しません。.
..
shopt -s extglob
拡張パターンマッチングを有効にし、グローバルshopt -s dotglob
マッチドットファイルを許可します。
答え2
これを使用しないでくださいls
。解析結果はls
最も信頼できず、最悪の場合は危険です。バラよりなぜいいえ解析ls
(および実行方法)?
試してfind
みてください。たとえば、GNU find
(およびGNU cp
)を使用している場合:
find ./ -maxdepth 1 -regextype awk \
! -regex './(|\.env|\.dockerfile)' \
-exec echo cp -t ../new_directory/ {} +
-regextype awk
私はawkの正規表現方言に非常に慣れているのでそれを使用していますfind-default
。 -regextype egrep
以下を実行して、利用可能な方言のリストを得ることができますfind -regextype help
(残念ながら、PCREはそのうちの1つではありません)。
除いて、そして。-regex ...
アンカーやアンカーはすべて必要ではなく、暗黙の述語なので、正確に一致する項目のみを取得できます。部分的に一致するには、正規表現の先頭および/または末尾に追加する必要があります。だから正規表現に含める必要がありました。./
./env
./dockerfile
^
$
find
-regex
.*
./
親ディレクトリで実行するには、次のように作成する必要があります。
find folder1/ -maxdepth 1 -regextype awk \
! -regex 'folder1/(|\.env|\.dockerfile)' \
-exec echo cp -t ../newfolder {} +
または、パス'.*/(|\.env|\.dockerfile)'
と一致する別のパターンを使用してください。
これにより、echo
実際にコピーせずにコピーする内容を示す練習になります。コマンドが希望どおりに機能することを確認したら、削除してください。
GNUcp
の-t
オプションを使用すると、コピーするファイルのリストの前にターゲットディレクトリを指定できます。