Bash / Shell 用于修改文件夹和子文件夹中的文件但不修改文件夹名称的脚本

Bash / Shell script to modify files in folders and sub folders but NOT to modify folder names

所以我有一个脚本可以遍历文件夹中的文件并将它们重命名为奇数和偶数。

我的问题是我分配了多个子文件夹,当我不想修改文件夹名称但我确实想修改子文件夹中的文件时,它会将它们重命名。

我怎样才能做到这一点?

#!/bin/bash

export FILE_PATH="/path1/path2/path3/"
export even=0
export odd=-1

for file in /path1/path2/path3/*; do

mv "$file" $FILE_PATH$(echo "$file" | sed -e 's/[^A-Za-z0-9.]/_/g');

done

for f in /path1/path2/path3/*; do

sum=$(sha1sum "$f" | awk '{print }');

if [[ "$sum" != 3c72363260a32992c3ab2e3a5e9b8cf082e02b2c ]]; then

even=$((even+2));
echo $FILE_PATH"even_"$even".mp4";
mv "$f" $FILE_PATH""$even".mp4";

else

odd=$((odd+2));
echo $FILE_PATH"odd_"$odd".mp4";
mv "$f" $FILE_PATH""$odd".mp4";

fi;

done

目前我的目录布局是这样的

/path1/path2/path3/random_folder_name/20.mp4

但是脚本一直输出这个。

/path1/path2/path3/1/20.mp4

而且我不想修改我的文件夹路径,只是在里面重命名了 mp4。

在每个 for 循环中,您可以做的第一件事是检查有问题的文件是否真的是文件或目录,并做出相应的反应,例如:

for file in /path1/path2/path3/*; do
    [[ -d "${file}" ]] && continue        # if it's a directory then skip to next pass through for loop

    mv "$file" ...
    ... snip ...
done

# and

for f in /path1/path2/path3/*; do        # if it's a directory then skip to next pass through for loop
    [[ -d "${f}" ]] && continue

    sum= ...
    ... snip ...
done

注意: 我建议根据需要查看 bash 的手册页以进行其他测试(例如,您需要担心符号链接吗?您需要担心可执行文件?你需要担心二进制文件吗?等等)

至于处理子目录中的文件的单独问题...请参阅 Nic3500 关于使用 find -type f ... 提供所有目录级别的文件列表的评论;请记住,这将需要重新设计您的整个流程(例如,将 2x for 循环替换为单个 while 循环)。

最近我为客户编写了一个脚本,用于在文件夹 [ 而不是子文件夹 ] 中搜索模式,并使用 find.

相应地修改它们

您可以通过设置-maxdepth 1在所需目录中搜索文件。我用过:

find ${matPath} -maxdepth 1 -name "*.*" -mtime +30 | sort | rev | cut -d "/" -f 1 | rev > ${curPath}/list.txt

在 list.txt 中获得列表后,您可以 运行 检查每个条目,使用 while 我更喜欢 (while IFS= read -r line) 来确定

  1. 如果条目是 markp-fuso 上面建议的文件或目录 使用 if-else 进行检查

  2. 一旦明显entry是文件,运行需要move命令或者copy命令,如果你想保留原始文件。 此执行可以作为嵌套添加 if 或在函数中调用。