Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在for循环中使用find将部分文件名提取为变量(bash)_Bash_Variables_For Loop_Find - Fatal编程技术网

在for循环中使用find将部分文件名提取为变量(bash)

在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

我有许多文件,它们的名称中有一段有用的信息,我想将其提取为变量并在后续步骤中使用。文件名的结构是samplename\u usefulbit\u junk。我试图使用文件名的可预测部分(samplename)遍历这些文件,将整个文件名存储在一个变量中,并使用
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')完成其他一些步骤
感谢您抽出时间回答我的问题!我对你的一些建议不太熟悉,无法将它们融入到我正在尝试的工作中,但我找到了一个更简单的解决方案,适合我的目的。