重命名部分目录名称?
Rename part of the directory names?
以下命令找到了以下目录。
$ find tmp/ -name "date=*" -type d
tmp/year=2022/month=05/date=27
tmp/year=2022/month=05/date=21
tmp/year=2022/month=05/date=29
tmp/year=2022/month=05/date=24
tmp/year=2022/month=05/date=31
tmp/year=2022/month=06/date=01
tmp/year=2022/month=06/date=02
我需要通过将 date=
替换为 day=
来重命名目录。
find tmp/ -name "date=*" -type d -exec rename s/date=/day=/g "{}" +;
但是,该命令不会重命名目录?
我需要在 Python 中实现它。
rename
实用程序不是标准 Unix tool/utilities 的一部分,并且有不同的风格。
我可能会建议坚持 bash
和 mv
使用这个 find
命令:
find tmp -name "date=*" -type d -exec bash -c '
for f;do echo mv "$f" "${f/date=/day=}"; done' _ {} +
出于测试目的,我在 mv
之前保留了 echo
。一旦对输出感到满意,只需从上面的命令中删除 echo
。
如果您想从 Python 执行此操作,则不需要子进程。
import os
for curdir, dirs, files in os.walk("/tmp"):
for dirname in dirs:
if dirname.startswith("date="):
new = dirname.replace("date=", "day=")
os.rename(os.path.join(curdir, dirname), os.path.join(curdir, new))
如果您使用的是 Python 3.4+,您可以使用 pathlib
:
from pathlib import Path
tmp = Path('tmp')
for o in tmp.rglob('date=*'):
if o.is_dir():
o.rename(o.with_name(o.name.replace('date', 'day')))
要解决您在 post 评论中提到的问题,您可以检查目标目录是否已经存在,然后按您希望的方式解决它。像这样:
from pathlib import Path
tmp = Path('tmp')
for o in tmp.rglob('date=*'):
new_name = o.with_name(o.name.replace('date', 'day'))
if o.is_dir():
if new_name.exists():
# Your logic to work around a directory
# that already exists goes here
else:
o.rename(new_name)
上面的代码只是一个初步的想法。它需要大量改进才能变得更加可靠。
以下命令找到了以下目录。
$ find tmp/ -name "date=*" -type d
tmp/year=2022/month=05/date=27
tmp/year=2022/month=05/date=21
tmp/year=2022/month=05/date=29
tmp/year=2022/month=05/date=24
tmp/year=2022/month=05/date=31
tmp/year=2022/month=06/date=01
tmp/year=2022/month=06/date=02
我需要通过将 date=
替换为 day=
来重命名目录。
find tmp/ -name "date=*" -type d -exec rename s/date=/day=/g "{}" +;
但是,该命令不会重命名目录?
我需要在 Python 中实现它。
rename
实用程序不是标准 Unix tool/utilities 的一部分,并且有不同的风格。
我可能会建议坚持 bash
和 mv
使用这个 find
命令:
find tmp -name "date=*" -type d -exec bash -c '
for f;do echo mv "$f" "${f/date=/day=}"; done' _ {} +
出于测试目的,我在 mv
之前保留了 echo
。一旦对输出感到满意,只需从上面的命令中删除 echo
。
如果您想从 Python 执行此操作,则不需要子进程。
import os
for curdir, dirs, files in os.walk("/tmp"):
for dirname in dirs:
if dirname.startswith("date="):
new = dirname.replace("date=", "day=")
os.rename(os.path.join(curdir, dirname), os.path.join(curdir, new))
如果您使用的是 Python 3.4+,您可以使用 pathlib
:
from pathlib import Path
tmp = Path('tmp')
for o in tmp.rglob('date=*'):
if o.is_dir():
o.rename(o.with_name(o.name.replace('date', 'day')))
要解决您在 post 评论中提到的问题,您可以检查目标目录是否已经存在,然后按您希望的方式解决它。像这样:
from pathlib import Path
tmp = Path('tmp')
for o in tmp.rglob('date=*'):
new_name = o.with_name(o.name.replace('date', 'day'))
if o.is_dir():
if new_name.exists():
# Your logic to work around a directory
# that already exists goes here
else:
o.rename(new_name)
上面的代码只是一个初步的想法。它需要大量改进才能变得更加可靠。