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
也可以完成,但这是我根据您的脚本想出的。
如果您对输出满意,请删除 echo
,这样 mv
实际上可以 rename/move 文件。
-
How can I find and safely handle file names containing newlines, spaces or both?
我正在尝试编写一个脚本来列出路径中的所有目录。转到每个目录,将每个目录中的一个 .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
也可以完成,但这是我根据您的脚本想出的。
如果您对输出满意,请删除
echo
,这样mv
实际上可以 rename/move 文件。How can I find and safely handle file names containing newlines, spaces or both?