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
) 来确定
如果条目是 markp-fuso 上面建议的文件或目录
使用 if-else 进行检查
一旦明显entry是文件,运行需要move
命令或者copy
命令,如果你想保留原始文件。
此执行可以作为嵌套添加 if
或在函数中调用。
所以我有一个脚本可以遍历文件夹中的文件并将它们重命名为奇数和偶数。
我的问题是我分配了多个子文件夹,当我不想修改文件夹名称但我确实想修改子文件夹中的文件时,它会将它们重命名。
我怎样才能做到这一点?
#!/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
) 来确定
如果条目是 markp-fuso 上面建议的文件或目录 使用 if-else 进行检查
一旦明显entry是文件,运行需要
move
命令或者copy
命令,如果你想保留原始文件。 此执行可以作为嵌套添加if
或在函数中调用。