检查文件是否存在于给定目录中,而不是子目录中
Check if a file exists in a given directory, NOT subdirectories
我写了一个 shell-脚本,主要用于查找 rar 文件并解压缩它们。
为了避免多次解压缩同一个文件,我添加了一个检查文件类型的检查,即 *.avi、*.mkv 和 *.mp4。
find "/mnt/media1/TV Shows/" -type f -name "*.rar" -print0 | while IFS= read -r -d '' file; do
DIR=$(dirname "${file}")
MKV=$(find "${DIR}" -name "*.mkv" -print0)
AVI=$(find "${DIR}" -name "*.avi" -print0)
MP4=$(find "${DIR}" -name "*.mp4" -print0)
if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then
printf "UNRARING ${DIR}\n" >> /home/johan/unrarer.log
sudo unrar e "${file}"
MKV=$(find "${DIR}" -name "*.mkv" -print0)
AVI=$(find "${DIR}" -name "*.avi" -print0)
MP4=$(find "${DIR}" -name "*.mp4" -print0)
if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then
printf "UNRAR FAILED\n" >> /home/johan/unrarer.log
else
printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log
fi
else
printf "${DIR}: Found an mkv, avi or mp4 file, skipping\n" >> /home/johan/unrarer.log
fi
done
现在,问题是大多数(如果不是全部)目录都有一个 "Sample" 子目录,其中有一个视频文件。这个文件被标记为我当前的实现,这不是我想要的。
我希望它在确切的目录 $DIR
中查找,而不是它的任何子目录。
目前我已经做了一个解决方法,我只是删除了 Sample 目录(如果它存在),但这会破坏 torrents。
我尝试使用 -wholename 进行了一些试验,但没有找到任何有效的方法。
感谢任何帮助。
此致,
约翰
使用-maxdepth
选项将查找限制在当前目录。
MKV=$(find "${DIR}" -name "*.mkv" -print0 -maxdepth 0)
AVI=$(find "${DIR}" -name "*.avi" -print0 -maxdepth 0)
MP4=$(find "${DIR}" -name "*.mp4" -print0 -maxdepth 0)
charlton_austin 的回答包含了答案。然而它是 -maxdepth 1.
完整脚本:
find "/mnt/media1/TV Shows/" -type f -name "*.rar" -print0 | while IFS= read -r -d '' file; do
DIR=$(dirname "${file}")
cd "${DIR}"
MKV=$(find . -maxdepth 1 -name "*.mkv" -print0)
AVI=$(find . -maxdepth 1 -name "*.avi" -print0)
MP4=$(find . -maxdepth 1 -name "*.mp4" -print0)
if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then
printf "UNRARING ${DIR}\n" >> /home/johan/unrarer.log
sudo unrar e "${file}"
MKV=$(find . -maxdepth 1 -name "*.mkv" -print0)
AVI=$(find . -maxdepth 1 -name "*.avi" -print0)
MP4=$(find . -maxdepth 1 -name "*.mp4" -print0)
if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then
printf "UNRAR FAILED\n" >> /home/johan/unrarer.log
else
printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log
fi
else
printf "${DIR}: Found an mkv, avi or mp4 file, skipping\n" >> /home/johan/unrarer.log
fi
done
您可以取得 globbing 的进步:
if [[ "$(ls ./*.{mkv,avi,mp4} 2> /dev/null)" != "" ]]; then
echo "exists"
else
echo "fail"
fi
find
在这里不是必需的,因为您只是在指定目录中查找具有给定扩展名的文件。只需使用模式填充一个数组。您似乎不需要将不同类型的文件分开;您只是在检查 某些东西 是否已取消存档。
cd "$DIR"
files=( "$DIR"/*.mkv "$DIR"/*.avi "$DIR"/*.mp4 )
if (( ${#files[@]} == 0 )); then
printf "UNRARING $DIR\n" >> /home/johan/unrarer.log
sudo unrar e "$file"
files=( "$DIR"/*.mkv "$DIR"/*.avi "$DIR"/*.mp4 )
if (( ${#files[@]} == 0 )); then
printf "UNRAR FAILED\n" >> /home/johan/unrarer.log
else
printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log
fi
else
printf "$DIR: Found an mov, avi, or mp4 file, skipping\n" >> /home/johan/unrarer.log
fi
如果您使用的是 bash
4 或更高版本,则不需要使用 find
来查找 rar 文件:
shopt -s globstar
for file in "/mnt/media1/TV Shows/"**/*.rar; do
...
done
我写了一个 shell-脚本,主要用于查找 rar 文件并解压缩它们。
为了避免多次解压缩同一个文件,我添加了一个检查文件类型的检查,即 *.avi、*.mkv 和 *.mp4。
find "/mnt/media1/TV Shows/" -type f -name "*.rar" -print0 | while IFS= read -r -d '' file; do
DIR=$(dirname "${file}")
MKV=$(find "${DIR}" -name "*.mkv" -print0)
AVI=$(find "${DIR}" -name "*.avi" -print0)
MP4=$(find "${DIR}" -name "*.mp4" -print0)
if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then
printf "UNRARING ${DIR}\n" >> /home/johan/unrarer.log
sudo unrar e "${file}"
MKV=$(find "${DIR}" -name "*.mkv" -print0)
AVI=$(find "${DIR}" -name "*.avi" -print0)
MP4=$(find "${DIR}" -name "*.mp4" -print0)
if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then
printf "UNRAR FAILED\n" >> /home/johan/unrarer.log
else
printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log
fi
else
printf "${DIR}: Found an mkv, avi or mp4 file, skipping\n" >> /home/johan/unrarer.log
fi
done
现在,问题是大多数(如果不是全部)目录都有一个 "Sample" 子目录,其中有一个视频文件。这个文件被标记为我当前的实现,这不是我想要的。
我希望它在确切的目录 $DIR
中查找,而不是它的任何子目录。
目前我已经做了一个解决方法,我只是删除了 Sample 目录(如果它存在),但这会破坏 torrents。
我尝试使用 -wholename 进行了一些试验,但没有找到任何有效的方法。
感谢任何帮助。
此致, 约翰
使用-maxdepth
选项将查找限制在当前目录。
MKV=$(find "${DIR}" -name "*.mkv" -print0 -maxdepth 0)
AVI=$(find "${DIR}" -name "*.avi" -print0 -maxdepth 0)
MP4=$(find "${DIR}" -name "*.mp4" -print0 -maxdepth 0)
charlton_austin 的回答包含了答案。然而它是 -maxdepth 1.
完整脚本:
find "/mnt/media1/TV Shows/" -type f -name "*.rar" -print0 | while IFS= read -r -d '' file; do
DIR=$(dirname "${file}")
cd "${DIR}"
MKV=$(find . -maxdepth 1 -name "*.mkv" -print0)
AVI=$(find . -maxdepth 1 -name "*.avi" -print0)
MP4=$(find . -maxdepth 1 -name "*.mp4" -print0)
if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then
printf "UNRARING ${DIR}\n" >> /home/johan/unrarer.log
sudo unrar e "${file}"
MKV=$(find . -maxdepth 1 -name "*.mkv" -print0)
AVI=$(find . -maxdepth 1 -name "*.avi" -print0)
MP4=$(find . -maxdepth 1 -name "*.mp4" -print0)
if [ ! -f "$MKV" ] && [ ! -f "$AVI" ] && [ ! -f "$MP4" ]; then
printf "UNRAR FAILED\n" >> /home/johan/unrarer.log
else
printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log
fi
else
printf "${DIR}: Found an mkv, avi or mp4 file, skipping\n" >> /home/johan/unrarer.log
fi
done
您可以取得 globbing 的进步:
if [[ "$(ls ./*.{mkv,avi,mp4} 2> /dev/null)" != "" ]]; then
echo "exists"
else
echo "fail"
fi
find
在这里不是必需的,因为您只是在指定目录中查找具有给定扩展名的文件。只需使用模式填充一个数组。您似乎不需要将不同类型的文件分开;您只是在检查 某些东西 是否已取消存档。
cd "$DIR"
files=( "$DIR"/*.mkv "$DIR"/*.avi "$DIR"/*.mp4 )
if (( ${#files[@]} == 0 )); then
printf "UNRARING $DIR\n" >> /home/johan/unrarer.log
sudo unrar e "$file"
files=( "$DIR"/*.mkv "$DIR"/*.avi "$DIR"/*.mp4 )
if (( ${#files[@]} == 0 )); then
printf "UNRAR FAILED\n" >> /home/johan/unrarer.log
else
printf "UNRAR SUCCESSFUL\n" >> /home/johan/unrarer.log
fi
else
printf "$DIR: Found an mov, avi, or mp4 file, skipping\n" >> /home/johan/unrarer.log
fi
如果您使用的是 bash
4 或更高版本,则不需要使用 find
来查找 rar 文件:
shopt -s globstar
for file in "/mnt/media1/TV Shows/"**/*.rar; do
...
done