第一次发帖所以对我宽容点哈哈。
初级 Linux 用户,开始使用 bash 脚本并想编写一个脚本来扫描我的电视节目文件夹以查找 fanart.jpg(每个节目都有此文件)创建一个副本,重命名它(据我所知,unix 系统不会自动重命名文件或允许一个目录中有相同名称的文件),并复制到壁纸文件夹。
我读过大量的文章,但似乎找不到一个相对简单的方法来做到这一点。
到目前为止我得到的是:
cd /mnt/TV\ Shows/
find /mnt/TV\ Shows/ -name fanart.jpg
它为我提供了各自文件夹中所有 fanart.jpg 文件的列表。
在此之后,我尝试了几种不同的方法sed
mv
,cp
但似乎无法使其发挥作用。
目标文件夹是/mnt/Wallpapers/Slideshow/
任何帮助都将不胜感激。
干杯!
答案1
以下是用户的示例脚本find
,其输出通过管道传输到while
循环:
find "/mnt/TV Shows/" -type f -name "fanart.jpg" | while IFS= read -r item; do
NAME="${item##*/}"
echo cp "$item" "/mnt/Wallpapers/Slideshow/${NAME%.*}-$((i++)).${NAME##*.}"
done
删除
echo
执行该操作。目标文件的名称将由以下部分组成:
${name of source file}-$((sequential number))-${extension of source file}
编号将从 开始
0
,因为变量$i
尚未预先初始化。您可以将 放在i=1;
之前find
以从 开始编号1
。
这里更加复杂狂欢脚本使用globstart
选项**
在文件夹中递归搜索文件。如果巧合,则文件将被复制到目标文件夹。您可以通过更改脚本的内部(if-fi)部分来选择不同的目标文件名模式。
#!/bin/bash
INPUT_PATH="/mnt/TV Shows"
INPUT_FILE_NAME="fanart.jpg"
OUTPUT_PATH="/mnt/Wallpapers/Slideshow"
shopt -s globstar
for item in "${INPUT_PATH}"/**; do
# If the item is a file and its name is equal to the INPUT_FILE_NAME
if [[ -f "$item" && "${item##*/}" == "$INPUT_FILE_NAME" ]]; then
# Compose OUTPUT_FILE name based on the parent directory name
INPUT_FILE_FULL_PATH="${item%/*}"
INPUT_FILE_PARENT_DIR="${INPUT_FILE_FULL_PATH##*/}"
OUTPUT_FILE_NAME="${INPUT_FILE_NAME%.*}-${INPUT_FILE_PARENT_DIR}.${INPUT_FILE_NAME##*.}"
# Remove 'echo' to execute the command !!!
echo cp "${item}" "${OUTPUT_PATH}/${OUTPUT_FILE_NAME}"
fi
done
参考: