我将文件存储在以下目录中:
Photo 1.jpg
Photo 2.jpg
Photo 3.jpg
在同一个文件夹中,我有一系列已经存在的子文件夹,其中包含其他文件:
Group 1
Group 2
Group 3
有没有办法将文件移动到名称包含相同数字的子文件夹?
答案1
我现在无法评论,所以我无法询问您使用的是 Windows 还是 Linux,或者您是否安装了 Python,因此,我将为它们两者编写脚本,
首先,PowerShell
# Get all .jpg files in the current directory.
$all_files = Get-ChildItem -Filter *.jpg
# Iterate through the list of files.
foreach ($file in $all_files) {
# Extract the number from the file name.
$number = $file.Name.Split(" ")[1].Split(".")[0]
# Print a message to the console.
Write-Host "Copying $file to Group $number/"
# Copy the file to the new folder.
Copy-Item $file "Group $number"
}
然后,Python
import glob
import shutil
import os
# Get All .jpg
all_files = glob.glob("*.jpg")
for file in all_files:
# Get that Number
number = file.split(" ")[1].split(".")[0]
print(f"Copying {file} to Group {number}/")
# if the folder, in case, do not exists, create it
if not os.path.exists(f"Group {number}"):
os.mkdir(f"Group {number}")
# copy the file
shutil.copy2(file, f"Group {number}")
请注意,在 Python 脚本中,我使用的是shutil.copy2()
函数,因为它可以保留日期/时间等元数据。此外,我使用的是复制而不是移动,因为要求防止任何不可预见的灾难。之后您可以删除 jpg。
不过,如果你有信心,你可以替换最后一行
shutil.copy2(file, f"Group {number}")
和
os.rename(file, f"Group {number}/{file}")
并在顶部添加此导入
import os
然后,对于 powershell,替换此行
# Copy the file to the new folder.
Copy-Item $file "Group $number"
有了这个,
# Move the file to the new folder.
Move-Item -Path $file -Destination "Group $number"
现在运行这些
为了电源外壳,创建一个文件名copy_script.ps1
,注意扩展名,不应该是.txt
,而是.ps1
。用记事本打开它,并粘贴上面的代码。右键点击脚本并选择使用 Powershell 运行,现在应该已经完成了
现在,对于 Python,如果你已经安装了 Python,那么你应该知道如何运行。但如果没有,请从下载并安装最新的 PythonPython 的网站。安装时,请务必检查“添加到路径”。然后创建一个名为 的文件copy_script.py
(再次不是.txt
而是.py
),粘贴上面的 Python 代码,然后双击它即可运行。现在应该完成了。
如果你不知道如何确认是否如此.ps1
,.py
请.txt
参阅此内容如何在 Windows 中启用文件扩展名
希望这可以帮助
答案2
@echo off
cd /d "D:\Full\Path\To\Folder\Where\JPGs\Are" 2>nul || exit /b
for /f delims^= %%i in ('dir /a: /b /a:-d *.jpg ^| findstr /e [0-9]\.jpg
')do set "_dir=%%~ni" && call move /y "%%~i" "%%_dir:photo=group%%"
Set-Location "D:\Full\Path\To\Folder\Where\JPGs\Are"
Get-ChildItem .\*.jpg | ForEach {
Move-Item $_ -Destination ($_.BaseName).Replace("Photo","Group")
}
cd "D:\Full\Path\To\Folder\Where\JPGs\Are" ; dir .\*.jpg | % {Move $_ -Destination ($_.BaseName).Replace("Photo","Group")}
PowerShell -Nol -NoP -Ex -By "gci .\*.jpg | ? { Move $_ -Dest ($_.BaseName).Replace('Photo','Group')}"
@cd "D:\Full\Path\To\Folder\Where\JPGs\Are" && @for /f delims^= %i in ('dir /a: /b /a:-d *.jpg ^| findstr /e [0-9]\.jpg')do @(%ComSpec% /v /c "set "_dir=%~ni" && call move /y "%~i" "!_dir:photo=group!"")
观察:考虑使用以下方法测试行为Move-Iten ... -WhatIf
:
cd "D:\Full\Path\To\Folder\Where\JPGs\Are" ; gci .\*.jpg | % {
Move $_ -Destination ($_.BaseName).Replace("Photo","Group") -WhatIf
}
cd "D:\Full\Path\To\Folder\Where\JPGs\Are" ; gci .\*.jpg | % {Move $_ -Dest ($_.BaseName).Replace("Photo","Group") -wi }
PowerShell -Nol -NoP -Ex -By "gci .\*.jpg | ? { Move $_ -Dest ($_.BaseName).Replace('Photo','Group') -wi}"
我将文件存储在以下目录中:
Photo 1 Photo 2 Photo 3
其中
folder I
有一系列已经存在的子文件夹,其中包含其他文件:Group 1 Group 2 Group 3
- 简单地用名称替换变量
%var:file=folder%
就可以为您提供精确的服务。
- 在电源外壳
>$Folder="Photo 1" >$Folder Photo 1 >$Folder=$Folder.Replace("Photo","Group") >$Folder Group 1
- 在批
>set "_var=Photo 1" >echo\%_var% Photo 1 >set "_var=%_var:Photo=Group%" >echo\%_var% Group 1
其他资源:
参考:电源外壳
参考:批
cd /d
Move /?
For /?
For /F /?
- 条件执行
- 命令重定向
|
,<
,>
,2>
, ETC。
- DOS - 字符串操作
- 如何:编辑/替换变量内的文本
- Windows 命令解释器如何
cmd.exe
解析脚本