2015-08-26 73 views
0

我有内容将文件复制文件

./home/a/a1/a1.1 
./home/a/a1/a1.2 
./home/a/a2/a2.1 
./home/a/a2/a2.2 
./home/a/a3 
./home/a/a4 
./home/b/b1 
./home/b/b2 

还有一个文本文件FILE2.TXT与内容的文本文件FILE1.TXT:

./copy/a/a1/a1.1 
./copy/a/a1/a1.2 
./copy/a/a2/a2.1 
./copy/a/a2/a2.2 
./copy/a/a3 
./copy/a/a4 
./copy/b/b1 
./copy/b/b2 

我创建脚本来复制所有文本文件

./home/a/a1/a1.1 to  ./copy/a/a1/a1.1 
./home/a/a1/a1.2 to  ./copy/a/a1/a1.2 
........ 
.... 

和其他行类似。

这里是脚本:

file1='/home/superjaggu/Desktop/file1.txt' 
    file2='/home/superjaggu/Desktop/file2.txt' 
    while IFS= read -r lineA && IFS= read -r lineB <&3; do 
    cp *.txt $linA $lineB 
    done <$file1 3<$file2 

,但其复制FILE1.TXT和FILE2.TXT到目标目录,而不是从源复制的文本文件。

请大家帮忙。

+0

CP $ {LINEA}/* TXT $ {} lineB –

+0

@MaheshKharvi感谢命令任何方式抑制CP的消息,其中TXT文件不存在CP:不能STAT './home/a/a1/a1.2/*.txt':没有这样的文件或目录 – Jaggu

+0

明白了:CP $ {LINEA}/* TXT $ {} lineB 2>/dev/null – Jaggu

回答

2

*.txt是错误的。它告诉cp复制匹配当前的工作目录*.txt的所有文件(实际上它告诉shell找到这些文件,如果你想挑剔他们的名字传递给cp)。其实cp认为*.txt$lineA是输入文件和$lineB是目标目录。顺便说一句,你在变量名中也有一个错字,变量名为$lineA而不是$linA。该修正后的脚本是:

file1='/home/superjaggu/Desktop/file1.txt' 
file2='/home/superjaggu/Desktop/file2.txt' 
while IFS= read -r lineA && IFS= read -r lineB <&3 
do 
    cp -- "$lineA"/*.txt "$lineB" 
done <"$file1" 3<"$file2" 
+0

我只想复制txt文件。对不起,这个错字。 – Jaggu

+2

@Jaggu,你的问题没有清楚说明名称是目录而不是文本文件本身,所以在给出工作代码之前,你的问题中的“只复制txt文件”是不清楚的。 –

0

最后工作:

file1='/home/superjaggu/Desktop/file1.txt' 
    file2='/home/superjaggu/Desktop/file2.txt' 
    while IFS= read -r lineA && IFS= read -r lineB <&3; 
    do 
    #cd $lineA  
    cp ${lineA}/*.txt ${lineB} 2>/dev/null 
    #cd -v '/home/superjaggu/Desktop' 
    done <$file1 3<$file2 
+2

你想'cp - “$ lineA”/ *。txt“$ lineB”'。花括号在这种情况下没有什么好处,所以你可以拿走它们或者离开它们,但是引号对于防止扩展名称中的空白和扩大球体是必不可少的。 –

+2

类似地,'<“$ file1”3 <“$ file2”' - 否则,如果'file1'或'file2'名称中有空格,就会失败。 –

+0

值得注意的是,@ Mecki的答案包含了一些这些修复 - 它们很重要。另外,它们是http://shellcheck.net/会为您找到的错误。 –