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

时间:2016-05-25 19:12:05

标签: bash rename 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'

4 个答案:

答案 0 :(得分:4)

您可以使用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" "..."但具有不同的循环。可根据您的需要进行更改。

答案 1 :(得分:2)

一种方法(假设你在包含.mp4文件的目录中):

function ip_to_int32(ip)
{
  return ip.split(".").map((x, i, a) => x * Math.pow(256, a.length - i - 1)).reduce((a,b) => a + b)
}

console.log(ip_to_int32("128.32.10.1"));
console.log(ip_to_int32("10.10.10.1"));
console.log(ip_to_int32("192.168.1.1"));

取消注释192.168.1.1 => 192*256^3 + 168*256^2 + 1*256^1 + 1*256^0. 行并移除for f in *.mp3 do new_name=$(echo -n "${f%.*}" | base64 -w0) cp "$f" "$new_name.${f##*.}" #mv "$f" "$new_name.${f##*.}" done 行以移动而不是复制。

mv的{​​{1}}选项禁用换行。如果没有它,您将在生成的文件名中得到问号,以防它们超过默认长度。来自man base64

cp

您只需在顶部添加文件扩展名,即可传入多个文件扩展名。 E.g。

-w0

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我假设您有多个文件,并且它们可能有不同的扩展名。因此,我将举例说明如何更改 文件的名称。

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

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而不更改扩展名!