6桁の数字で始まり、リスト内の数字と一致するファイルを見つけます。

6桁の数字で始まり、リスト内の数字と一致するファイルを見つけます。

私は約185,000個のファイルで構成された巨大なコレクションを持っています。

 312095_ck_image-24-10-20-11-29-1.jpeg
 312095_ck_image-24-10-20-11-29-2.jpeg
  312095_ck_image-24-10-20-11-29.jpeg

デフォルトでは、この6桁の数字はユーザーID(一部のバックエンドOracleデータベースによって提供されます)であり、
各ユーザーIDはディレクトリに複数回表示されることがあります。また、1行に6桁の数字(約18,000個)を含むテキストファイルもあります。ファイルディレクトリをテキストファイルの内容と一致させることは可能ですか?したがって、ファイルがテキストファイルの数字で始まる場合は、後でフォルダを削除できるように、ファイルを別のディレクトリ(残りの名前や拡張子に関係なく)に移動したいと思います。個々のファイルの代わりにフォルダ全体を削除できるように、フォルダに一致するすべてのファイルが必要です。これはLinuxで可能ですか(シェルまたはソースから別のLinuxプログラムをインストール/ビルドすることによって)。オペレーティングシステムのバージョンはRHEL Linux 6です。これが簡単になったら、ディレクトリ内のファイルのリストをデータベーステーブルにロードし、それをテキストファイルの数値のリストと一致させて、どのファイル名が削除/移動されるかを正確に知ることができます。ファイルを移動/削除できるように、そのリストをmvコマンドに供給する方法がわかりません。これを実装する最も簡単な方法は何ですか?したがって、私の物理フォルダがあり、/new_upload/entrants/参加者と同じレベルにジャンクという空のフォルダがあり、 /new upload/junk 実行しようとしているIDのリストに312095が表示される場合

mv 312095_*   /new_upload/junk 

[idis] entrants# sh -h
sh-4.1# 
[idis] entrants# $SHELL --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
 

ベストアンサー1

GNUシステムでは、次のことができます。

find . -type f -print0 |
  LC_ALL=C gawk -F/ '
    !list_processed {user[$0]; next}
    match($NF, /^([0-9]{6})_/, f) && f[1] in user
    ' user-list.txt list_processed=1 RS='\0' ORS='\0' - |
  xargs -r0 mv -it /where/to/move/them --

おすすめ記事