【问题标题】:Copy one file from subdirectory从子目录复制一个文件
【发布时间】:2014-04-03 01:54:00
【问题描述】:

尊敬的脚本专家, 作为脚本的新手,我非常感谢您的帮助。 我有一个简单的任务: 我有一组目录 dir1 dirxy dir ... 每个目录中都有一些文件,但我只想复制其中一个,比如说一个以 A 开头的文件...

搜索这个页面我发现了一个列出子目录的脚本:

for i in *
do                 # Line breaks are important
    if [ -d $i ]   # Spaces are important
        then
            "do some task"
    fi
done

做一些任务是个问题... 我想将带有 A* 的文件复制到另一个目录并将其重命名为 B_nameofparentdirectory

非常感谢 彼得

【问题讨论】:

    标签: bash copy wildcard subdirectory


    【解决方案1】:

    使用 find 添加类似于其他答案的实现

    for file in $(find . -name "A*" -type f)
    do      
        cp ${file} ${destDir}/B_${destDir}
        break
    done
    

    您可以为此使用 find 列出当前目录及其子目录中以 A 开头的所有文件。

    find . -name "A*" -type f
    

    【讨论】:

    • 您可能只想要. 而不是pwd。除此之外,您可能想要$PWD
    • @kojiro 是的,. 就足够了,通常我会使用它,但不推荐使用 pwd。谢谢。
    • pwd in backticks 将在子shell 中运行pwd,因此获取shell 已经知道的$PWD 和. 的值是一项非常昂贵的操作。在这种情况下我不会推荐它。
    【解决方案2】:

    您可以通过以斜杠结尾的方式让 glob 仅匹配目录,这样您就可以编写脚本

    for i in */; do
      "do some task"
    done
    

    在每个目录中,您可以使用break 语句使内部循环只处理第一个文件:

    for i in */; do
      for f in "${i}"A*; do
        cp "$f" "$dest/B_$dest"
        break
      done
    done
    

    这将导致循环继续处理每个外部目录,但在每个目录中只处理名为 A* 的第一个文件。

    也就是说,您可以使用find 命令更直接地完成此操作:

    find . -mindepth 2 -maxdepth 2 -type f -name 'A*' -execdir cp {} "$dest/B_$dest" \;
    

    【讨论】:

      猜你喜欢
      • 2019-12-08
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2017-11-18
      相关资源
      最近更新 更多