请稍侯

批量解压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