有关的:根据 csv 列表将具有匹配前缀的所有文件移动到文件夹
我有一个两列 CSV 文件(逗号分隔值),其中包含标题:
"id","group"
"F1256","old"
"E51651","new"
"X56369","new"
"G5481369","old"
"54564564T","old"
"544-5F5","new"
"1298FFF","old"
"JKL-wew_w","new"
我将这些文件放在一个目录中:
2014-12-15_T921_F1256.png
E51651_hf_2018-9-19.jpg
hf_oldX56369_15-10-2014.xml
2018-07_xx54564564T_hfdata.bmp
G5481369oldbackup_2018-01-01.txt
我想grep
对这些文件使用(或任何其他类似的工具),并将它们的文件名与id
我的 CSV 文件的列进行匹配。一旦匹配(即,如果id
在文件名中准确找到),则必须将文件移动到适当的group
子目录。
因此,必须在当前目录中创建两个文件夹old
和,new
并且必须根据所描述的条件移动所有这些文件。
结果
old
├──2014-12-15_T921_F1256.png
├──2018-07_xx54564564T_hfdata.bmp
├──G5481369oldbackup_2018-01-01.txt
new
├──E51651_hf_2018-9-19.jpg
├──hf_oldX56369_15-10-2014.xml
我怎样才能做到这一点?
答案1
解决方案awk
可以是:
awk -F, 'NR>1 { group[$2]= group[$2]? group[$2] "* *" $1: $1 ;next }
END {
for (x in group) printf( "echo mv *%s* -t %s\n" , group[x], x )
}' infile.csv| sh
echo
如果您对结果满意,请删除。
.
├── infile.csv
├── new
│ ├── E51651_hf_2018-9-19.jpg
│ └── hf_oldX56369_15-10-2014.xml
└── old
├── 2014-12-15_T921_F1256.png
├── 2018-07_xx54564564T_hfdata.bmp
└── G5481369oldbackup_2018-01-01.txt
这将立即移动属于相关目录组的所有文件。
关于awk
解释,请看我最近的回答。
答案2
您可以通过首先 sed n xargs 来完成此操作
sed -e '
s/","/* /;s/^"/*/;s/"$//;1d
' | xargs -l sh -c 'mv $1 "$2"' _
注意:使用 xargs 管道时需要注意的所有注意事项,例如引号、空格等。
答案3
在Python中:
import csv, os, glob
filenames = []
filedir = 'files'
with open('filelist.csv', 'rb') as f:
reader = csv.reader(f)
filelist = list(reader)
filelist.pop(0)
for k, filename in enumerate(glob.glob(filedir + '/*')):
filenames.append(os.path.basename(filename))
for (id, directory) in filelist:
matches = [e for e in filenames if id in e]
for (filename) in matches:
if not os.path.exists(directory):
os.makedirs(directory)
os.rename(filedir + '/' + filename, directory + '/' + filename)
答案4
尝试这个:
#!/bin/bash
input_file="$1"
base_dir="$2"
delim=","
while read -r line
do
id=${line%$delim*}
group=${line#*$delim}
mv *"${id}"* "$base_dir//$group"
done < "$input_file"
此示例流程输入文件不包含定义(第一)行,并且 id、group 不带引号