按文件夹层次结构重命名文件

4
我有许多具有以下结构的文件:

1969/ar/1.jpg
1969/ar/2.jpg

1969/he/1.jpg
1969/he/2.jpg

1969/en/1.jpg
1969/en/2.jpg

1970/ar/1.jpg

我希望用一个命令将它们全部重命名到一个文件夹中,同时它们的名称反映它们原始文件夹的位置。
1969_ar_1.jpg
1969_ar_2.jpg

1969_he_1.jpg
1969_he_2.jpg

1969_en_1.jpg
1969_en_2.jpg

1970_ar_1.jpg

有没有一条命令或批处理文件可以实现这个功能?

谢谢!

3个回答

4
您可以使用以下命令行将文件移动到基础文件夹中:

for /R %a in (*) do @set f=%a& set f=!f:%cd%\=!& move "%a" !f:\=_!

请在包含1969、1970等文件夹的文件夹中执行此命令。重要提示:为了使此行有效,必须启用延迟扩展,因此您必须先使用 /V 开关执行 cmd.exe 来激活它,方法如下:cmd /V

例如:

>xcopy test backup /s
test\1969\ar\1.jpg
test\1969\ar\2.jpg
test\1969\en\1.jpg
test\1969\en\2.jpg
test\1969\he\1.jpg
test\1969\he\2.jpg
test\1970\ar\1.jpg
7 File(s) copied

>cd test

>dir /B
1969
1970

>for /R %a in (*) do @set f=%a& set f=!f:%cd%\=!& move "%a" !f:\=_!

>dir /B
1969
1969_ar_1.jpg
1969_ar_2.jpg
1969_en_1.jpg
1969_en_2.jpg
1969_he_1.jpg
1969_he_2.jpg
1970
1970_ar_1.jpg

将这一行修改为以下内容,以将文件移动到另一个文件夹中:

for /R %a in (*) do @set f=%a& set f=!f:%cd%\=!& move "%a" "\other\folder\!f:\=_!"

或通过此批处理文件:

@echo off
setlocal EnableDelayedExpansion
for /R %%a in (*) do set f=%%a& set f=!f:%cd%\=!& move "%%a" "\other\folder\!f:\=_!"

3
在包含所有*.jpg文件的根目录下运行此命令。 将目标文件夹更改为您想要的位置: 请先在一些样本上进行测试。
@echo off
for /f "delims=" %%z in ('dir "*.jpg" /b /s /a-d ') do (
for %%a in ("%%~dpz%\.") do (
for %%b in ("%%~dpa\.") do (
  ren "%%z" "%%~nxb_%%~nxa_%%~nxz"
  move "%%~dpz\%%~nxb_%%~nxa_%%~nxz" "c:\target\folder"
)
)
)
pause

3

尝试这个(查看输出并在move之前删除单词echo,如果一切正常):

@echo off &setlocal
for /d %%i in (19* 20*) do (
    cmd /c "for /r "%%i" %%j in (*.jpg) do @for %%k in ("%%~dpj.") do @echo move "%%~j" "%%i_%%~nk_%%~nxj""
)

文件夹名字有两个“folder”(folder_folder_file),但是删除了 %%~nk_ 后就可以工作了——虽然我并不完全理解这个酷炫的命令行……谢谢! - BurninLeo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接