Bash 使用cp复制和更改从filelist.file读取的文件的名称

Bash 使用cp复制和更改从filelist.file读取的文件的名称,bash,for-loop,ubuntu-12.04,cat,cp,Bash,For Loop,Ubuntu 12.04,Cat,Cp,我希望脚本复制文件夹3中addresses.list(其中包含这些文件的绝对路径)中的文件,并在文件名中添加变量k(它们来自的较低文件夹的名称) 脚本对我来说是有意义的,但它不起作用,它说:“cp:无法创建常规文件”;有什么建议吗 #!/bin/bash cd /folder1/ for k in $( cat lowerfolders_list ); do for f in $( cat addresses.lst ); do cp $f "/folder1/fol

我希望脚本复制文件夹3中addresses.list(其中包含这些文件的绝对路径)中的文件,并在文件名中添加变量k(它们来自的较低文件夹的名称)

脚本对我来说是有意义的,但它不起作用,它说:“cp:无法创建常规文件”;有什么建议吗

#!/bin/bash
cd /folder1/

for k in $( cat lowerfolders_list ); do
    for f in $( cat addresses.lst ); do 
        cp $f "/folder1/folder2/folder3/${k}_$f"
        cd /folder1/
    done
done
我得到的确切错误是“cp:无法创建常规文件”`/A/B/C/D/E/folder1/folder2/folder3/my$k/path_to_my_file/myfile.sdf的名称:没有这样的文件或目录”

编辑

即使我可以复制那些仅以$k命名的文件也没关系,但当我尝试这样做时,我的输出是addresses.lst中的最后一个文件,并且我的下文件夹列表中的每个名称都多次出现。 这是我使用的脚本:

#!/bin/bash
cd /folder1/

for k in $( cat lowerfolders_list ); do
    for f in $( cat addresses.lst ); do 
        cp "$f" "/folder1/folder2/folder3/${k}"
    done
    cd -
done
有什么建议吗

#!/bin/bash
cd /folder1/

for k in $( cat lowerfolders_list ); do
    for f in $( cat addresses.lst ); do 
        cp $f "/folder1/folder2/folder3/${k}_$f"
        cd /folder1/
    done
done
编辑 已解决

#!/bin/bash
cd /folder1/

for k in $( cat lowerfolders_list ); do
    for f in $( cat addresses.lst ); do 
    myfile=$( basename "$f" )   
    cp "$f" "/folder1/folder2/folder3/${k}_${myfile}"
    done
    cd -
done

感谢所有做出贡献的人。

很抱歉,如果不了解命令的作用而保留用于其他目的的命令,则会给您带来麻烦。在市场营销中,这似乎是可行的,但在计算机科学中,做一些你不懂的事情会很快中断。早点停止练习。试着首先了解什么是目录结构。阅读
man cd
man cp
man mkdir

因此,
cd
命令正在破坏您的脚本,因为它会更改目录,并且您最初读取的文件和目录列表将变为无效路径。但也许我知道你想干什么

第二件事是读取目录和类似文件的列表是不安全的。如果他们的名字中有空格,它就会坏掉。但让我们暂且不谈

那么您就不会创建目录结构“/folder1/folder2/folder3”。如果在运行脚本之前不存在,它也会中断。使用
mkdir-p

所以我对你要做的最好的猜测是:

for k in $( cat lowerfolders_list ); do
    cd "${k}" 
    for f in $( cat addresses.lst ); do 
        cp "$f" "/folder1/folder2/folder3/${k}_$f"
    done
    cd -
done

您的用户是否有权在该目录中创建文件?还有,为什么在循环中使用
cd
cp
不会更改目录。我有权限这样做,脚本末尾的cd在一个类似的脚本中为我工作过一次,所以我将它保留在这个脚本中,但无论如何都不会对脚本造成不良影响。。。我想。在该循环中使用
touch”/folder1/folder2/folder3/${k}\u$f“
而不是
cp
是否正确工作?不,同样的错误:touch:无法触摸然后需要重新检查您的权限。
ls-l/folder1/{,folder2/{,folder3/}}
说什么?仍然不工作,没有文件夹名称中包含空格,并且我已经有了目标文件夹。我得到的错误是:无法创建常规文件“/A/B/C/D/E/folder1/folder2/folder3/my$k/path_to_my_file/myfile.sdf”:没有这样的文件或目录