bash 列出路径中所有目录的脚本,带有转义字符和 CD 到每个目录以执行操作

bash script to list all directories in a path withescape charectes and CD into each to perform action

我正在尝试编写一个脚本来列出路径中的所有目录。转到每个目录,将每个目录中的一个 .srt 文件重命名为同一子目录中的 .mp4 文件的名称(扩展名较小)。 每个子目录都有一个.mp4和一个.srt文件。

在 return 我得到这个 $ ./change.sh ./change.sh: line 2: Lawless: command not found here LawLess (1111) 是列表中第一个目录的名称目录数。

代码是

#!/bin/bash
yourPathEscaped=$(`find  -mindepth 1 -maxdepth 1 -type d | cut -d . -f2 | cut -d \/ -f2 | sed 's/ /\ /g' | sed 's/,/\, /g' | sed -e s/\'/\\\'/g`)
for dirm in $yourPathEscaped

do
  cd $dirm
  echo $dirm
  for f in `ls *.mp4 | grep -Po '.*(?=\.)'`; do echo $f; mv *.srt $f.srt; ls ; done
  for f in `ls *.mkv | grep -Po '.*(?=\.)'`; do echo $f; mv *.srt $f.srt; ls ; done

cd ..

done

假设每个目录只有一个 .srt 文件,这可能会满足您的要求。使用 while + read 循环和 Process Substitution

#!/usr/bin/env bash

while IFS= read -rd '' files; do
  directory=${files%/*}
  (
    cd "$directory" || exit
    shopt -s nullglob
    for f in *.mp4 *.mkv; do
      printf '%s\n' "$f"
      file_name=${f%.*}
      echo mv -v -- *.srt "${file_name}.srt"
    done
  )
done < <(
  find "" -mindepth 1 -maxdepth 1 -type f \( -name '*.mp4' -o -name '*.mkv' \) -print0
)

  • 虽然没有 cd 也可以完成,但这是我根据您的脚本想出的。