【问题标题】:bash copy files at extract path from originalbash 从原始文件的提取路径复制文件
【发布时间】:2015-09-29 05:44:16
【问题描述】:

我需要将一组文件路径复制到其他位置:

find . -name '*.txt': 
/a/b/c/d/e/f/filea.txt
/a/b/c/d/e/g/h/fileb.txt
/a/b/c/d/e/k/l/filec.txt

我想将每个文件复制到包含 e 和之后的路径例如:

cp /a/b/c/d/e/f/filea.txt e/f/

e 路径将永远存在。 我需要首先找到所有文件。 如何从路径中找到、提取e之后的所有内容并同时复制?

【问题讨论】:

  • 使用来自herewhile/read 循环解决方案之一,然后使用您想要剪切路径并创建复制命令的任何工具。或者,使用find 查找e 目录,然后将这些目录cp -r 查找到目标位置。

标签: linux bash sed grep find


【解决方案1】:

find 输出通过管道传递

sed 's|\(.*\)\(\*\*e\*\*.*/\)\(.*\)|cp \1\2\3 \2|' 

如果结果看起来不错,将 sed 输出通过sh 传递。如果**e** 只是指e,则模式是

 sed 's|\(.*\)\(e.*/\)\(.*\)|cp \1\2\3 \2|' 

【讨论】:

  • 我认为它不起作用,它匹配第一组中的所有内容:(.*),之后没有第二组。
  • .* 确实匹配所有内容,但随后 sed 备份,直到它匹配 **e** 字符串。也许您只是说e** 只是为了强调?所以用你的实际e 替换它。我会编辑答案。
  • 好的,唯一的问题是它把文件名放在最后,这不好,应该是cp文件夹。我编辑了这个问题。是否可以删除第二组中的文件名?
【解决方案2】:

你可以使用这样的东西。如果生成的 mkdir 和 cp 命令看起来没问题,您可以删除它们之前的 echo。

SOURCE="/a/b/c/d"
cd $SOURCE
DESTINATION="full/path/to/whatever"

for FILE in $(find . -name '*.txt');做

DIR=$(dirname $FILE)  
# create the intermediate directories if they don't exist  

echo "mkdir -p $DESTINATION/$DIR"  

echo "cp $FILE $DESTINATION/$DIR"  

完成

【讨论】:

    猜你喜欢
    • 2020-10-19
    • 2022-01-01
    • 2010-11-02
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多