我有一些.mp4文件,并希望将其名称重命名为文件名的base64值,但保留扩展名不受base64编码限制。为此,我需要一个bash脚本。
e.g.: file is file-fly34567.mp4 (and others)
echo 'file-fly34567' | base64 --> ZmlsZS1mbHkzNDU2Nw==
then 'file-fly34567.mp4' -> 'ZmlsZS1mbHkzNDU2Nw==.mp4'
答案 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而不更改扩展名!