Bash 使用cp复制和更改从filelist.file读取的文件的名称
我希望脚本复制文件夹3中addresses.list(其中包含这些文件的绝对路径)中的文件,并在文件名中添加变量k(它们来自的较低文件夹的名称) 脚本对我来说是有意义的,但它不起作用,它说:“cp:无法创建常规文件”;有什么建议吗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
#!/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”:没有这样的文件或目录