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

时间:2018-10-18 20:32:39

标签: bash shell

TL; DR:我希望所有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 个答案:

答案 0 :(得分:2)

您可以先进入深度,然后仅替换基名:

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("K:K")) Is Nothing Then Exit Sub
If Target.Value <> "2" Then Exit Sub
Target.EntireRow.Interior.ColorIndex = 8
MsgBox "2nd First Article Build. Notify Quality Techs to Create Fixture "
End Sub

如果您使用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}

您得到:

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

消除回声,移动应无错误。

相关问题