批量解压shell script
28 March 2024
批量解压 - shell script
使用 unrar 命令批量解压当前目录下的所有 .rar 文件到当前目录
find . -type f -name "*.rar" -exec unrar x {} . \; -exec unrar l {} \;
# 使用yes命令传入A跳过输入提示:[Y]es, [N]o, [A]ll, n[E]ver, [R]ename, [Q]uit
yes A | find . -type f -name "*.rar" -exec unrar x {} . \; -exec unrar l {} \;
删除当前目录下所有.rar压缩包文件
find . -type f -name "*.rar" -exec rm {} +
synology群晖命令行中批量解压当前目录下的 .zip 文件
for file in *.zip; do 7z x "$file"; done
# 解决文件名中文乱码, 通过添加参数"-mcp=936"来指定字符编码为简体中文GB2312
for file in *.zip; do 7z x -mcp=936 "$file"; done
批量删除当前文件夹下所有前缀为”单人直播”的mp4文件名中的前缀
for file in "单人直播"*.mp4; do echo mv "$file" "${file/单人直播/}"; done
shell脚本实现: 遍历将当前目录下的每个文件夹,当遍历到的文件夹的名字与他的子文件夹的名字相同时,将他的子文件夹中的所有文件都移动到其父目录。
#!/bin/bash
# 以下代码可复制在终端里直接执行
# EOF上的引号转义解决命令解析错误,'EOF' 使用了单引号将结束标记引起来,这样结束标记将被视为普通字符串。另一种解决方法是在 Here Document 的结束标记 EOF 之前使用无空格的版本,例如 EOFFILE,即可EOF 改成 EOFFILE。
bash << 'EOF'
# 遍历当前目录下的每个文件夹
for folder in */; do
folder_name=$(basename "$folder")
# 查找具有相同名称的子文件夹
subfolder_name=$(find "$folder" -mindepth 1 -maxdepth 1 -type d -name "$folder_name" -printf "%f\n")
# 如果找到相同名称的子文件夹
if [[ -n $subfolder_name ]]; then
echo "Moving files from $subfolder_name to $folder_name"
# 移动子文件夹中的所有文件到父目录
mv "$folder$subfolder_name"/* "$folder"
# 删除空的子文件夹
rmdir "$folder$subfolder_name"
fi
done
EOF
逆序文件名中前缀个索引字符 - 当前文件夹中共有32个mp4文件
for filename in *.mp4;
do num=$(echo "$filename" | sed 's/\(^[0-9]*\).*/\1/');
if [[ "$num" =~ ^0 ]]; then num="${num#0}"; fi;
index=$(printf "%03d" $((32 - ${num#0} + 1)));
new_filename="${index} - ${filename#*\ -\ }";
echo mv "$PWD/$filename" "$PWD/$new_filename";
done
# 写在一行里
for filename in *.mp4; do num=$(echo "$filename" | sed 's/\(^[0-9]*\).*/\1/'); if [[ "$num" =~ ^0 ]]; then num="${num#0}"; fi; index=$(printf "%03d" $((32 - ${num#0} + 1))); new_filename="${index} - ${filename#*\ -\ }"; echo mv "$PWD/$filename" "$PWD/$new_filename"; done
# 改srt
for filename in *.srt; do num=$(echo "$filename" | sed 's/\([0-9]*\).*/\1/'); if [[ "$num" =~ ^0 ]]; then num="${num#0}"; fi; index=$(printf "%03d" $((32 - ${num#0} + 1))); new_filename="${index} - ${filename#*\ -\ }"; echo mv "$PWD/$filename" "$PWD/$new_filename"; done
