Bash - 将文件重命名为文件名的 base64 值

Bash - Rename files to base64 value of the filenames

我有一些 .mp4 文件,想将它们的名称重命名为文件名的 base64 值,但不要使用 base64 编码作为扩展名。为此,我需要一个 bash 脚本。

e.g.: file is file-fly34567.mp4 (and others)
echo 'file-fly34567' | base64 --> ZmlsZS1mbHkzNDU2Nw==
then 'file-fly34567.mp4' -> 'ZmlsZS1mbHkzNDU2Nw==.mp4'

您可以使用 mv 重命名(移动)一个。要获取 base64 部分,您可以使用命令替换:

mv -- "$file" "$(printf "%s" "${file%.mp4}" | base64).mp4"

如果要更改目录中所有 mp4 文件的文件名:

for file in *.mp4; do
  [ -e "$file" ] || continue
  mv -- "$file" "$(printf "%s" "${file%.mp4}" | base64).mp4"
done

或重命名目录中的所有文件:

for file in *; do
# for file in * .*; do # for hidden files
  [ -f "$file" ] || continue
  mv -- "$file" "$(printf "%s" "${file%.*}" | base64).${file##*.}"
done

并从换行符分隔的文件中重命名所有文件:

while IFS= read -r file; do
  mv -- "$file" "$(printf "%s" "${file%.*}" | base64).${file##*.}"
done < file.txt

如您所见,上述所有命令都使用相同的核心部分 mv -- "$file" "..." 但循环不同。可以根据您的需要进行更改。

我假设您有 1 个以上的文件,并且它们可能有不同的扩展名。因此,我会给你一个改变文件名的例子。

更改多个文件,无论其扩展名如何

fullfiles=(/home/user/.../myfile.mp4 /home/user2/.../myfile2.png ...)

for fullfile in "${fullfiles[@]}"; do
    dirname=$(dirname "$fullfile")
    filename=$(basename "$fullfile")
    extension=${filename##*.}
    filename=${filename%.*}
    base64name=$(echo -n "$filename" | base64)
    mv "$fullfile" "$dirname/$base64name.$extension"
done

这会将列表中每个文件的名称更改为其 base64,而不更改扩展名!

一种方法(假设您位于包含 .mp4 文件的目录中):

for f in *.mp3
do
    new_name=$(echo -n "${f%.*}" | base64 -w0)
    cp "$f" "$new_name.${f##*.}"
    #mv "$f" "$new_name.${f##*.}"
done

取消注释 mv 行并删除 cp 行以移动而不是复制。

base64-w0 选项禁用换行。如果没有它,您将在生成的文件名中看到问号,以防它们比默认长度长。来自 man base64:

-w, --wrap=COLS
      wrap encoded lines after COLS character (default 76).  Use 0 to disable line wrapping

您可以传入多个文件扩展名,只需将它们添加到顶部即可。例如

for f in *.mp4 *.mp3 *.flv
rename 'use MIME::Base64;
        s/\.mp4$//;
        $_ = encode_base64($_, "") . ".mp4"' *.mp4