ルートディレクトリのドットファイルを移動できないのはなぜですか?

ルートディレクトリのドットファイルを移動できないのはなぜですか?

以下に示すように、ディレクトリにいくつかのファイル、フォルダ、およびドットファイルがあります。

|-folder1
|----folder2
|----file.json
|----file2.php
|----.env
|----.dockerfile
|----.someconfig
|----.dockerignore

除外するmv $(ls | egrep -v '(.dockerfile|.env)') ../new_directoryディレクトリ内のすべてのファイルを移動するコマンドを実行しましたが、実際にはすべてのドットファイルを移動することはできません。なぜですか?folder1new_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オプションを使用すると、コピーするファイルのリストの前にターゲットディレクトリを指定できます。

関連情報