많은 수의 파일이 이름에 타임스탬프가 포함되어 "이름이 변경되었습니다". 일괄 이름을 바꾸는 방법을 찾을 수 없습니다. "Batch Rename Utility"와 같은 일괄 이름 바꾸기를 사용하고 regex 명령을 사용하려고 하는데 명령을 만들 수 없습니다.
잘못된 파일 이름은 다음과 같습니다. [130bpm] salsaish (2020_11_04 13_32_49 UTC).wav
파일은 다음과 같아야 합니다.[130bpm] salsaish.wav
따라서 삭제된 문자열은 다음과 같습니다 (2020_11_04 13_32_49 UTC)
. 그러나 이러한 문자열은 이름이 변경된 시기에 따라 변경될 수 있으며 파일에 특수 문자가 포함될 수 있습니다.
이름을 모두 바꾸는 방법이 있나요?
답변1
내 경우엔 Synology
안 Perl
되고 안 돼 rename
. 안전 문제로 인해공격 표면Perl
, 장치에 아무것도 추가하면 안 됩니다 . 플러그인이 있지만 sh
기본 쉘인 pure를 사용할 수 있습니다( sh
링크 bash
):
for i in *.wav; do echo mv -- "$i" "${i% (*}.wav"; done
또는치환존재하다매개변수 확장:
for i in *.wav; do echo mv -- "$i" "${i// (*)/}"; done
이것은 쉘을 사용합니다매개변수 확장 바라보다:http://mywiki.wooledge.org/BashFAQ/073그리고 man bash의 "매개변수 확장". 또한보십시오http://wiki.bash-hackers.org/syntax/pe
% (*
오른쪽 부분을 삭제한다는 뜻 [[:space:]](*
입니다 glob
.정규식.
echo
출력이 만족스러우면 제거하십시오.
답변2
Perl로 구현된 프로그램( 패키지의 일부인 rename
다른 프로그램이 있음 ):rename
util-linux
$ perl-rename -n 's, \(.+?\),,' *
[130bpm] salsaish (2020_11_04 13_32_49 UTC).wav -> [130bpm] salsaish.wav
탐욕스럽지 않은 방식으로 첫 번째 공백과 괄호 및 그 사이의 모든 항목을 제거합니다. 새 이름이 원하는 이름인지 확인하고 -n
실제로 이름 바꾸기를 수행하려면 삭제하세요.
답변3
오래 지연되어 죄송합니다. 다음은 제가 PHP에서 사용하는 코드입니다.
<?php
function getDirContents($dir, &$results = array()) {
$files = scandir($dir);
foreach ($files as $key => $value) {
$path = realpath($dir . DIRECTORY_SEPARATOR . $value);
if (!is_dir($path)) {
$results[] = $path;
} else if ($value != "." && $value != "..") {
getDirContents($path, $results);
$results[] = $path;
}
}
return $results;
}
$dir = getDirContents('./DBM5000');
echo '<table equalcells="1">';
foreach($dir as $file)
{
$good_file = preg_replace("/ \([^)]+\)/","", $file);
$isfile = is_file($good_file);
echo '<tr>';
echo '<td>'.$file.'</td>';
echo '<td>'.$good_file.'</td>';
if(pathinfo($good_file, PATHINFO_EXTENSION))
{
echo '<td>FILE</td>';
rename($file, $good_file);
}
else
{
echo '<td>DIRECTORY</td>';
}
echo '</tr>';
}
echo '</table>';