【问题标题】:Bash - Rename files to base64 value of the filenamesBash - 将文件重命名为文件名的 base64 值
【发布时间】:2016-09-23 13:34:01
【问题描述】:

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

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

【问题讨论】:

  • 注意base64编码中可能出现的'/'字符。在许多文件系统中,这不是有效的文件名字符。

标签: bash rename filenames


【解决方案1】:

您可以使用mv 重命名(移动)a。要获取 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" "...",但循环不同。可以根据您的需要进行更改。

【讨论】:

  • [ -e "$file" ] -f 选项,这可能会更好,因为它将排除任何以“.mp4”结尾的目录
  • 这是一个很好的技巧,但它只适用于具有相同(并且从一开始就知道)扩展名的文件......
  • 哦,我错过了他只想更改一种文件类型
【解决方案2】:

一种方法(假设您在包含 .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

【讨论】:

  • 谢谢,这很好用,但是长文件名存在问题。因为在 base64 中,它将长编码值分解为新行。所以如果这个脚本可以修剪那个 CRLF 那么一切都会好起来的。 @jDo
  • @ianmel99 不错的收获。这是base64程序的一个特性。我已在更新的答案中禁用它。
【解决方案3】:
rename 'use MIME::Base64;
        s/\.mp4$//;
        $_ = encode_base64($_, "") . ".mp4"' *.mp4

【讨论】:

  • 注意在某些系统上这称为perl-renamerename 来自util-linux
【解决方案4】:

我假设您有超过 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 而不更改扩展名!

【讨论】:

    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 2012-01-02
    • 2023-03-22
    • 2019-05-02
    • 2020-02-18
    • 2016-08-01
    • 2014-01-06
    • 2015-12-11
    相关资源
    最近更新 更多