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
我有一些 .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