我有一个文件夹(称之为testdir),在子文件夹中有许多不同的文件类型。有许多文件具有相同的名称但扩展名不同,甚至具有相同名称/扩展名的文件(但可能不相同)。 我需要一个脚本,只将mp3和mp4文件从testdir及其子文件夹存档到存档文件夹(不将它们放在子文件夹中)。如果archieve文件夹不存在,请创建它。 但 - 仅复制没有.mp3(具有相同名称)的.mp4文件 - 比较.mp3文件是否有更多具有相同名称的文件并复制它们不相同并重命名 - 复制没有.mp3(同名)的.mp4文件(仅限) 该脚本需要有2个参数,因此它应该像:arch source_dir archive_dir,如果用户使用错误则显示错误消息。此外,如果source_dir不存在。 这是我到目前为止所得到的:
#!/bin/bash
#declare variables
SOURCE_DIR=$1
ARCHIEVE_DIR=$2
#if the user forgets to use 2 arguments:
if [ $# -ne 2 ]
then echo Usage: arch source_dir archieve_dir
fi
#if the source_dir does not exist:
if [ ! -d $SOURCE_DIR ]
then echo ERROR: Source directory is missing!
fi
# if archieve_dir does not exist, create it
if [ ! -d $ARCHIEVE_DIR ]
then mkdir $ARCHIEVE_DIR
fi
echo $ARCHIEVE_DIR created.
cd $ARCHIEVE_DIR
find . -type f \( -iname "*.mp3" -o -iname "-.mp4" \)
# copy all the .mp4 files that have no .mp3 pairs (with the same name)
#copy .mp3 files that have .mp4 identicals (leave mp4s)
# copy and rename the .mp3 files that are not identical but have the same name
非常感谢任何形式的帮助!感谢提前
答案 0 :(得分:0)
根据您的第一个要求,您可以循环浏览所有mp4文件并测试每个文件:
#!/bin/bash
# .. your parameter checks ..
# copy all the .mp4 files that have no .mp3 pairs (with the same name)
for file in $(find . -type f -iname "*.mp4")
do
filemp3=$(echo $file | sed s'/.$/3/')
if [[ $(find . -type f -iwholename $filemp3|wc -l) == 0 ]] ; then
cp $file $ARCHIVE_DIR/
fi
done
对于第二个要求,复制所有mp3是否足够:
# copy .mp3 files that have .mp4 identicals (leave mp4s)
find . -type f -iname "*.mp3" -exec cp -t $ARCHIVE_DIR/ {} +
你的第三个要求我不知道我是否完全遵循,如果你想要检查同名mp3文件的内容是否不同,你可以使用diff工具,如下所示,但是找到的逻辑所有相同名称的文件,并将它们提供给你需要自己弄清楚的差异
# copy and rename the .mp3 files that are not identical but have the same name
# ...
DIFF=$(diff a b)
if [ "$DIFF" != "" ]
then
echo "The files differ"
fi
# ...
还可以选择使用一些用于查找重复项的tool,例如dupeguru(Win,Mac,Ubuntu,Arch Linux)。