基于最新文件筛选并批量复制多路径文件至目标文件夹
批量搜索并复制含指定片段的最新文件
以下针对不同操作系统提供实用脚本,实现从多路径搜索含指定文件名片段的文件,筛选每个片段对应的最新文件并统一复制到目标文件夹。
Windows(PowerShell 实现)
将以下代码保存为.ps1脚本,替换配置参数后在PowerShell中运行:
# 配置参数 - 替换为你的实际路径和文件名列表 $searchTerms = @("20222023", "其他文件名片段") $sourcePaths = @("C:\SourceDir1", "D:\SourceDir2", "E:\SourceDir3") $targetFolder = "F:\TargetDir" # 创建目标文件夹(不存在则自动创建) if (-not (Test-Path $targetFolder)) { New-Item -ItemType Directory -Path $targetFolder | Out-Null } foreach ($term in $searchTerms) { $candidateFiles = @() # 遍历所有源路径搜索匹配文件 foreach ($path in $sourcePaths) { $matchedFiles = Get-ChildItem -Path $path -Filter "*$term*" -File -Recurse if ($matchedFiles) { # 按创建时间降序,取当前路径下最新的文件 $latestInPath = $matchedFiles | Sort-Object CreationTime -Descending | Select-Object -First 1 $candidateFiles += $latestInPath } } if ($candidateFiles) { # 从所有路径的候选文件中,取全局最新的一个 $finalLatest = $candidateFiles | Sort-Object CreationTime -Descending | Select-Object -First 1 # 复制到目标文件夹,重名时强制覆盖(可去掉-Force改为手动确认) Copy-Item -Path $finalLatest.FullName -Destination $targetFolder -Force Write-Host "已复制: $($finalLatest.Name)" } else { Write-Host "未找到含 '$term' 的文件" } }
说明
-Filter "*$term*"精准匹配文件名中包含指定片段的文件Sort-Object CreationTime -Descending按创建时间倒序排序,确保筛选出最新文件-Recurse会递归搜索子文件夹,若无需递归可直接删除该参数
Linux/macOS(Bash 实现)
将以下代码保存为.sh脚本,替换配置参数后添加执行权限并运行:
#!/bin/bash # 配置参数 - 替换为你的实际路径和文件名列表 SEARCH_TERMS=("20222023" "其他文件名片段") SOURCE_PATHS=("/home/user/source1" "/mnt/drive/source2" "/opt/source3") TARGET_FOLDER="/home/user/target" # 创建目标文件夹(不存在则自动创建) mkdir -p "$TARGET_FOLDER" for term in "${SEARCH_TERMS[@]}"; do latest_file="" latest_timestamp=0 for path in "${SOURCE_PATHS[@]}"; do # 递归搜索含指定片段的文件 find "$path" -type f -name "*$term*" | while read -r file; do # 获取文件修改时间戳(Linux用%Y,macOS替换为%B) # Linux 版本 file_timestamp=$(stat -c "%Y" "$file") # macOS 版本:取消注释下面一行,注释上面一行 # file_timestamp=$(stat -f "%B" "$file") if (( file_timestamp > latest_timestamp )); then latest_timestamp=$file_timestamp latest_file=$file fi done done if [ -n "$latest_file" ]; then filename=$(basename "$latest_file") # 检查目标文件夹是否已存在同名文件,存在则添加编号避免覆盖 if [ -f "$TARGET_FOLDER/$filename" ]; then name="${filename%.*}" ext="${filename##*.}" counter=1 while [ -f "$TARGET_FOLDER/$name-$counter.$ext" ]; do ((counter++)) done cp "$latest_file" "$TARGET_FOLDER/$name-$counter.$ext" echo "已复制(重命名): $name-$counter.$ext" else cp "$latest_file" "$TARGET_FOLDER/" echo "已复制: $filename" fi else echo "未找到含 '$term' 的文件" fi done
说明
- 执行前需添加权限:
chmod +x search_and_copy.sh - 若需按创建时间而非修改时间筛选,Linux将
stat -c "%Y"改为stat -c "%Z",macOS将stat -f "%B"改为stat -f "%c" find命令默认递归搜索子文件夹,若需限制仅当前目录可添加-maxdepth 1参数
内容的提问来源于stack exchange,提问作者Nathan Seiler
相关产品推荐
相关产品推荐

