私は約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 --
答え2
GNUがあるので、bash
シェル構成とGNUを使用するのは簡単ですgrep
。
#!/bin/bash
for file in *; do
match=$(echo "${file}" | grep -o '^[[:digit:]]\{6\}')
if [[ -z "${match}" ]] ; then
# File did not start with 6 digits, delete
rm -- "${file}"
else
grep -q -F ${match} numbersfile.txt || rm -- "${file}"
fi
done
それは:
- すべてのファイル名を繰り返します。
- 各ファイル名が
grep
6桁の数字で始まることを確認してください。 - そうでない場合は、ファイルを削除してください。
- その場合は、
grep
一致する番号があることを確認してください。numbersfile.txt
- そうでない場合は、ファイルを削除してください。
(削除する前にテストするには、次のようrm
に置き換えると、echo
削除するすべてのファイルのリストが表示されます)