代码之家  ›  专栏  ›  技术社区  ›  jeremysprofile Subin George

使用find和mv更改嵌套文件夹中的名称(版本号)

  •  2
  • jeremysprofile Subin George  · 技术社区  · 6 年前

    热释光;医生:我希望所有的2.6都是2.7

         lib
         └── python2.6
            └── site-packages
                ├── x
                │   ├── x.py
                │   ├── x.pyc
                │   ├── __init__.py
                │   ├── __init__.pyc
                │   └── test
                │       ├── __init__.py
                │       └── __init__.pyc
                └── x-0.2.0-py2.6.egg-info
                    ├── dependency_links.txt
                    ├── entry_points.txt
                    ├── PKG-INFO
                    ├── requires.txt
                    ├── SOURCES.txt
                    └── top_level.txt
    

    我试过的:

    find . -type d -name "*2.6*" -exec bash -c 'mv "$1" "${1/2.6/2.7}"' -- {} \; 
    

    no such file or directory

    有没有一个好的方法来做嵌套查找和移动?在这种情况下,我可以运行两次命令,从技术上讲,这是可行的,但它感觉脏。

    find . -type d -name "*python2.6*" -exec bash -c 'mv "$1" "${1/2.6/2.7}"' -- {} \; 
    find . -type d -name "*py2.6*" -exec bash -c 'mv "$1" "${1/2.6/2.7}"' -- {} \; 
    

    但是我更感兴趣的是学习bash是否有一种方法来解决这个问题,而不是如何处理这个狭窄的场景。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Petr Skocik    6 年前

    您可以先进入深度,然后仅在basename中替换:

    find  lib -depth -type d -name "*2.6*" -exec \ 
          bash -c 'basename="${1##*/}" && mv "$1" "${1%/*}/${basename/2.6/2.7}"' -- {} \; 
    

    如果你用一个 echo

    find  lib -depth -type d -name "*2.6*" -exec \
          bash -c 'bn="${1##*/}" && echo mv "$1" "${1%/*}/${bn/2.6/2.7}"' -- {} \; 
    

    在用以下对象创建的树上:

    mkdir -p lib/python2.6/site-packages/{x/test,x-0.20-py2.6.egg-info}
    

    i、 e.,开:

    lib/
    └── python2.6
        └── site-packages
            ├── x
            │   └── test
            └── x-0.20-py2.6.egg-info
    

    你会得到:

    mv lib/python2.6/site-packages/x-0.20-py2.6.egg-info lib/python2.6/site-packages/x-0.20-py2.7.egg-info
    mv lib/python2.6 lib/python2.7