.txtで終わらないすべてのファイルを移動する

.txtで終わらないすべてのファイルを移動する

ディレクトリ内に/home/username/dataファイルとディレクトリの両方があります。これらのファイル名のいくつかは.txt次のように終わります。テキストファイル)、他の人はそうではありません。サブディレクトリでも同じことが起こります。

サブディレクトリの1つother_files(フルパス/home/username/data/other_files/)を呼び出します。

始まらないすべてを移動したい.txt ルートに /home/username/data到着するother_files


ループを使用してこれを実行できますが、これは私が望むものではありません。コマンドとパイプを使いたいです。私はそれが簡単だと確信しています。私はそれを見ません。 、、の組み合わせがトリックを実行する必要がありますが、どのようにmvすべきかわかりません。findgrepxargs

だから私はテキストファイルを一致させようとしました(そしてそれを除いてすべてを一致させる方法を見つけようとしました)。以下は、現在のディレクトリがあると仮定します/home/username/data
最初に選択しましたが、find . | grep -E "*\.txt"サブディレクトリのファイルを含むすべてのテキストファイルと一致します。
だからfind . | grep -E "\./*\.txt"同じマッチが出てくるかどうかを調べて目標に向かって努力しましたが、何もマッチしなかったし、そこで詰まっていました。


質問の冒頭で説明した内容をどのように実行しますか?

ベストアンサー1

単純なシェルループバリエーション(in bash):

shopt -s extglob dotglob nullglob

for pathname in ~username/data/!(*.txt); do
    ! test -d "$pathname" && mv "$pathname" ~username/data/other_files
done

最初の行に設定されているシェルオプションを使用すると、シェルbashで拡張globbingパターンを有効にします(.!(*.txt)で終わらない.txtすべての名前と一致)。

ループ本文は、ディレクトリ(またはディレクトリへのシンボリックリンク)内のすべてのエントリをスキップし、他のすべてのエントリを指定されたディレクトリに移動します。

findGNUに対応する機能mv(シンボリックリンクがある場合はディレクトリに移動し、mv同時に多くのファイルを呼び出しますが、これが唯一の違いです):

find ~username/data -maxdepth 1 ! -type d ! -name '*.txt' \
    -exec mv -t ~username/data/other_files {} +

関連:

おすすめ記事