我正在尝试根据文件名将文件重组到新目录中。这是通过GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)
上的OS X High Sierra
目前,我有一个父目录,其中包含2个子目录集,100 +个子目录,然后是一组图像,这些图像的文件名在我所拥有的3000多个文件中是常见的。
所以父级(dir)->子类别(dirs)->更深的子类别(dirs)->文件
文件名非常相似,即login.png或splash.png,我在3000个文件中可能只有40个唯一的文件名。但是,这些子类别是唯一的。
我正在尝试将所有相同的文件名(即所有login.png文件)递归复制到新文件夹中,但是要使用任意唯一标识符将其重命名。此唯一标识符无关紧要。它可以是任意数字,甚至可以是父目录名称(即login_subdirectoryname.png
)
我尝试了几件事,甚至只是获得所有可用文件的列表:
因此,使用类似的方法至少可以向我显示所有可用文件:
find ./Parent -name "*.PNG" -type f -exec echo_name.sh basename {} \;
echo_name.sh
很简单:
echo_name(){
echo $1
}
echo_name $1
我创建了一个函数,因为我想我们需要做更多的事情,例如检查新目录中是否存在名称为“ login”的文件夹,如果不存在,请创建它。
所以我需要能够在这里完成两件事...
A)维护一些唯一变量以在传递给find
的{{1}}函数中计数,因此每个文件名仅增加一个(即echo_name.sh
), < em>或 附加父目录名称(即login_1.png
),以避免在创建实际的login_thissubcategory. png
B)确定没有扩展名和路径的严格文件名以及路径。所以我的功能需要知道:
我知道它是一个复杂的重组,但是可以提供任何帮助。
答案 0 :(得分:1)
您可以结合使用find
和xargs
和内联bash
脚本来实现此目的:
$ mkdir -p parent/category{1,2}/subcat{a,b,c,d,e}/
$ touch parent/category{1,2}/subcat{a,b,c,d,e}/{login,splash}.png
$ find . -type f | nl | xargs -n2 -I@ bash -c 'set -- @; b=${2##*/}; echo cp $2 ${b%.*}_$1.${b##*.}'
cp ./parent/category1/subcata/login.png login_1.png
cp ./parent/category1/subcata/splash.png splash_2.png
cp ./parent/category1/subcatb/login.png login_3.png
cp ./parent/category1/subcatb/splash.png splash_4.png
cp ./parent/category1/subcatc/login.png login_5.png
cp ./parent/category1/subcatc/splash.png splash_6.png
cp ./parent/category1/subcatd/login.png login_7.png
cp ./parent/category1/subcatd/splash.png splash_8.png
cp ./parent/category1/subcate/login.png login_9.png
cp ./parent/category1/subcate/splash.png splash_10.png
cp ./parent/category2/subcata/login.png login_11.png
cp ./parent/category2/subcata/splash.png splash_12.png
cp ./parent/category2/subcatb/login.png login_13.png
cp ./parent/category2/subcatb/splash.png splash_14.png
cp ./parent/category2/subcatc/login.png login_15.png
cp ./parent/category2/subcatc/splash.png splash_16.png
cp ./parent/category2/subcatd/login.png login_17.png
cp ./parent/category2/subcatd/splash.png splash_18.png
cp ./parent/category2/subcate/login.png login_19.png
cp ./parent/category2/subcate/splash.png splash_20.png
前两行仅设置了测试工具。最后一行很有趣。让我们分解一下:
find . -type f | \ # use find to locate the files -- change this as needed
nl | \ # number each line -- this gives us the unique id for each
xargs -n2 -I@ \ # pass the line number and full file name to each...
bash -c \ # ... instance of bash we start
'set -- @; b=${2##*/}; echo cp $2 ${b%.*}_$1.${b##*.}'
引号内的肉如下:
set -- @
将两个参数分成$1
(第#行)和$2
(文件的完整路径)b=${2##*/}
获取文件的基本名称echo cp $2
回显cp命令的开头-删除echo
即可,并根据需要进行调整${b%.*}_$1.${b##*.}
获取文件名的一部分,不带扩展名,在末尾添加_,添加行号,然后添加回。扩展部分。我避免使用空格,空值,换行和其他非ASCII字符来处理文件名,因为OP提示这不是问题。如果这是一个问题,将需要其他技术。