在for循环中使用find将部分文件名提取为变量(bash)
我有许多文件,它们的名称中有一段有用的信息,我想将其提取为变量并在后续步骤中使用。文件名的结构是samplename\u usefulbit\u junk。我试图使用文件名的可预测部分(samplename)遍历这些文件,将整个文件名存储在一个变量中,并使用在for循环中使用find将部分文件名提取为变量(bash),bash,variables,for-loop,find,Bash,Variables,For Loop,Find,我有许多文件,它们的名称中有一段有用的信息,我想将其提取为变量并在后续步骤中使用。文件名的结构是samplename\u usefulbit\u junk。我试图使用文件名的可预测部分(samplename)遍历这些文件,将整个文件名存储在一个变量中,并使用sed提取有用的位。它不起作用 samples="sample1 sample2 sample3" for i in $samples; do filename="$(find ./$FILE_DIR -maxd
sed
提取有用的位。它不起作用
samples="sample1 sample2 sample3"
for i in $samples; do
filename="$(find ./$FILE_DIR -maxdepth 1 -name '$(i)*' -printf '%f\n')"
usefulbit="$(find ./$FILE_DIR -maxdepth 1 -name '$(i)*' -printf '%f\n' | sed 's/.*samplename//g' | sed 's/junk.*//g')"
(More steps using $usefulbit or $(usefulbit) or ${usefulbit} or something)
done
find./$FILE\u DIR-maxdepth 1-name'sample1*'-printf'%f\n'
和find./$FILE\u DIR-maxdepth 1-name“sample1*”-printf'%f\n'
这两种方法都有效,但括号、花括号、单引号、双引号或反引号的组合都不能使循环起作用。哪里出了问题 试试这个:
for file in `ls *_*_*.*`
do
echo "Full file name is: $file"
predictable_portion_filename=${file_%%_*}
echo "predictable portion in the filename is: ${predictable_portion_filename}"
echo "---"
done
PS:$variable或${variable}或“${variable}”或“$variable”与$(variable)不同,因为在最后一种情况下,$(…)生成一个子shell并将其中的任何内容作为命令处理,即$(variable)将使子shell执行名为variable的命令
您还可以使用(递归查找具有该标准文件名的所有文件):ls-1R*\u*\ u**
除了使用${file%%.*}之外,还可以使用:echo${file}| cut-d'-f1来获取可预测的值。您还可以使用各种其他方法(awk、sed等)。对不起,我不能用bash来完成,我可以给您演示另一种方法吗?下面是我正在开发的一个shell(lua shell),以及一个演示,作为您案例的解决方案:
wws$ `ls ./demo/2
sample1_red_xx.png sample2_green_xx.png sample3_blue_xx.png
wws$ source ./demo/2.lua
sample1_red_xx.png: red
sample2_green_xx.png: green
sample3_blue_xx.png: blue
wws$
我真的很想知道你的整个计划,除非你需要bash作为唯一的工具。。。
呃,我不想贴剧本,
samples={"sample1", "sample2", "sample3"}
files = lfs.collect("./demo/2")
function get_filename(prefix)
for i, file in pairs(files) do
if string.match(file.name, prefix) then return file.name end
end
end
for i = 1, #samples do
local filename = get_filename(samples[i])
vim:set(filename)
:f_lvf_hy
print(filename ..": ".. vim:clipboard())
end
“get_filename()”似乎有点冗长。。。我还没有完成lfs组件。我不确定用我的最终解决方案回答我自己的问题是否合适,但这就是最终对我起作用的原因:
for i in directory/*.ext; do
myfile="$i"
name="$(echo $i | sed 's!.*/!!g' | sed 's/_junk*.ext//g')"
some other steps
done
这样,我就可以从文件名已经是一个变量(在变量中?)开始,而不必为find
及其强烈的观点而挣扎。这也使我不必列出样本名称
第一个
sed
删除目录/,第二个删除文件名和扩展名的结尾,留下一个变量$name,在后续步骤中生成其他文件时用作前缀。简单多了 谢谢,这对我帮助很大。这就是我最后使用的:for I in directory/*.ext;do myfile=“$i”name=“$(echo$i | sed's!。*/!!g'| sed's/_junk*.ext//g')完成其他一些步骤
感谢您抽出时间回答我的问题!我对你的一些建议不太熟悉,无法将它们融入到我正在尝试的工作中,但我找到了一个更简单的解决方案,适合我的目的。