【问题标题】:Copying files from and to locations named in text files在文本文件中命名的位置之间复制文件
【发布时间】:2015-08-26 15:16:54
【问题描述】:

我有包含内容的文本文件 file1.txt

./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:

./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复制到目标目录而不是从源复制文本文件。

请帮忙。

【问题讨论】:

  • cp ${lineA}/*.txt ${lineB}
  • @MaheshKharvi 感谢命令以任何方式抑制不存在 txt 文件的 cp 消息 cp: cannot stat './home/a/a1/a1.2/*.txt': No such文件或目录
  • 知道了:cp ${lineA}/*.txt ${lineB} 2>/dev/null
  • 旁白:使用标准的、以换行符分隔的文本文件来存储 UNIX 文件名是不好的形式,因为 UNIX 文件名本身可以包含文字换行符。因此,可能存在无法以这种格式存储的文件名。 NUL 分隔的文件名流避免了这个问题。
  • cd ./home; find . -type f -name "*.txt" -print0 | cpio -0dump ../copy/. 应该足够了...

标签: linux bash shell unix ubuntu


【解决方案1】:

*.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"

【讨论】:

  • 我只想复制txt文件。很抱歉这个拼写错误。
  • @Jaggu,您的问题并没有明确说明名称是目录而不是文本文件本身,因此在给出工作代码之前,您的问题中“仅复制 txt 文件”的含义尚不清楚。
【解决方案2】:

终于成功了:

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

【讨论】:

  • 你想要cp -- "$lineA"/*.txt "$lineB"。在这种情况下,花括号没有任何好处,因此您可以使用或保留它们,但引号对于防止空格拆分和扩展名称中的 glob 扩展至关重要。
  • 类似地,&lt;"$file1" 3&lt;"$file2" -- 否则,如果 file1file2 名称中包含空格,则会失败。
  • 值得注意的是,@Mecki 的回答包括其中一些修复——它们很重要。此外,它们是 shellcheck.net 会为您找到的错误。
  • @CharlesDuffy 是正确的。您真的应该在变量周围使用引号,否则目录名称中的空格会破坏您的脚本。 shell 脚本中的路径应始终使用引号。而且您还想要-- 并且仅仅是因为目录名称可能以破折号开头(否则- 会导致目录被解释为IMO 选项)。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 2010-11-17
  • 1970-01-01
  • 2013-12-09
相关资源
最近更新 更多