2

.txt ファイルにパターンのリストがあります。[list.txt]。list.txt の各行について、list.txt で指定されたパターンで始まる場所にあるすべてのファイルを検索し、これらのファイルを別の場所に移動したいと考えています。例を考えてみましょう。

で、この~/home/ana/folder_aようlist.txtに見えます...

list.txt

1abc
2def
3xyz

この場所/home/ana/folder_a/には、list.txt のパターンで始まる複数のファイルがあります。したがって、1abc_a.txt、1abc_c.txt、1abc_f.txt、2def_g.txt、3xyz_a.txt のようなファイルがあります。

だから私が達成したいのはこれです:

for i in cat list.txt; do 
  ls | grep '^$i' [thats the pattern] | 
  mv [files containing the pattern] to /home/ana/folder_b/

他の場所、つまり /home/ana/folder_b/ には、パターンごとに固有のディレクトリが既に作成されていることに注意してください。

したがって、 /home/ana/folder_b/ には 1abc/ 、 2def/ 、 3xyz/ などのサブディレクトリが含まれます。実際には、パターン '1abc'、'2def' および '3xyz' に一致するすべてのファイルを /home/ana/folder_a/ から移動したいと考えています。 /home/ana/folder_b/ のそれぞれのサブディレクトリに、/home/ana/folder_b/1abc に 1abc_a.txt 、 1abc_c.txt 、および 1abc_f.txt が含まれるようにします。/home/ana/folder_b/2def/ には 2def_g.txt が含まれ、/home/ana/folder_b/3xyz/ には 3xyz_a.txt が含まれます。

4

3 に答える 3

2

grep の-fオプションはファイルのパターンに一致するため、次のファイルの各行をループする必要はありませんshell

$ ls                              # List all files in dir, some match, some don't
1abc_a.txt 1abc_c.txt 1abc_f.txt  2def_g.txt 3xyz_a.txt file1 file2 list.txt

$ cat list.txt                    # List patterns to match against 
1abc
2def
3xyz

$ ls | grep -f list.txt           # grep for files that only match pattern
1abc_a.txt
1abc_c.txt
1abc_f.txt
2def_g.txt
3xyz_a.txt

パイプをxargs移動して移動します。

ls | grep -f list.txt | xargs -i -t mv {} ../folder_B
mv 1abc_a.txt ../folderB 
mv 1abc_c.txt ../folderB 
mv 1abc_f.txt ../folderB 
mv 2def_g.txt ../folderB 
mv 3xyz_a.txt ../folderB 

編集:質問のサブディレクトリ部分を見逃したことに気づきました.@Thorの回答がこれに対する最良のアプローチですが、それでもこの回答から何らかの用途が見つかると思います.

于 2012-12-18T08:40:02.673 に答える
1

グロブ展開がここに行く方法だと思います:

while read pattern; do
  mv "${pattern}"* ../folder_b/"$pattern"
done < list.txt

echoコマンドの前に を付けて開始しmv、出力に満足したら削除します。

于 2012-12-18T08:21:07.843 に答える
0

-execのアクションを使用してループfindを呼び出すことをお勧めします。mv

ファイル構造の開始: (ご覧のとおり、これを folder_a と folder_b の親から呼び出しています)

$ find
.
./folder_a
./folder_a/1abc_a.txt
./folder_a/1abc_c.txt
./folder_a/1abc_f.txt
./folder_a/2def_g.txt
./folder_a/3xyz_a.txt
./folder_b
./folder_b/1abc
./folder_b/2def
./folder_b/3xyz
./list.txt

$ cat list.txt
1abc
2def
3xyz

指図:

while read pattern
 do 
  find ./folder_a -type f -name "$pattern*" -exec mv "{}" "./folder_b/$pattern" \;
 done <list.txt

代替コマンド (同じこと、すべて 1 行で):

while read pattern; do find ./folder_a -type f -name "$pattern*" -exec mv "{}" "./folder_b/$pattern" \;; done <list.txt

結果のファイル構造:

$ find
.
./folder_a
./folder_b
./folder_b/1abc
./folder_b/1abc/1abc_a.txt
./folder_b/1abc/1abc_c.txt
./folder_b/1abc/1abc_f.txt
./folder_b/2def
./folder_b/2def/2def_g.txt
./folder_b/3xyz
./folder_b/3xyz/3xyz_a.txt
./list.txt
于 2012-12-18T15:20:46.867 に答える