如何列出最新目录并将其作为变量添加到bash脚本中以递归方式处理文件

如何列出最新目录并将其作为变量添加到bash脚本中以递归方式处理文件,bash,Bash,如何列出最新目录并将其作为变量添加到bash脚本中以递归方式处理文件 ls -t1 | head -n1 可以完美地列出最新目录,但我想将该目录名添加到脚本中,以便使用以下脚本处理其中的文件: #!/bin/bash ls | while read -r FILE do mv -v "$FILE" `echo $FILE | tr ' ' '_' ` done ls | while read -r FILE do mv -v "$FILE" `echo $FILE | tr '

如何列出最新目录并将其作为变量添加到bash脚本中以递归方式处理文件

ls -t1 | head -n1
可以完美地列出最新目录,但我想将该目录名添加到脚本中,以便使用以下脚本处理其中的文件:

#!/bin/bash
ls | while read -r FILE
do
    mv -v "$FILE" `echo $FILE | tr ' ' '_' `
done
ls | while read -r FILE
do
    mv -v "$FILE" `echo $FILE | tr '\*.JPEG' '\*.jpg' `
done
    mogrify -resize 750 *.jpg
wait 
    jpegoptim *.jpg –max=70 --strip-all
exit
我还希望递归地处理文件,可能最多有一级子目录

基本上,bash脚本保持在目录的根目录,并处理所有最新的目录和子目录文件

好的,我将脚本修改为:

#!/bin/bash
DIR=ls -t1 | head -n1
ls $DIR | while read -r FILE
do
    mv -v "$FILE" `echo $FILE | tr ' ' '_' `
done
ls $DIR | while read -r FILE
do
    mv -v "$FILE" `echo $FILE | tr '\*.JPEG' '\*.jpg' `
done
    mogrify -resize 750 $DIR/*.jpg
wait 
    jpegoptim $DIR/*.jpg –max=70 --strip-all
exit

但是它似乎无法识别$DIR变量。

此bash脚本将重命名并转换当前目录中最新目录中的jpg文件以及该目录下第一级目录中的文件

#!/bin/bash

FIRST_DIR=`ls -t1F | grep / | head -n1`
DIR="./${FIRST_DIR}"
ls -t1F $DIR | while read -r FILE
do
    if [ "$FILE" ]
    then
        if [[ $FILE = */ ]]
        then
            echo "here ${DIR}${FILE}."
            DEEP_DIR="${DIR}${FILE}"
            ls -t1 $DEEP_DIR | while read -r FILE2
            do
                if [ "$FILE2" ]
                then
                    if [[ $FILE2 != */ ]]
                    then
                        RENAME=`echo ${FILE2//\*/} | tr ' ' '_' `
                        mv -v "${DEEP_DIR}${FILE2//\*/}" "${DEEP_DIR}${RENAME}"
                        FILE2=$RENAME

                        RENAME2=`echo ${FILE2//\*/} | tr '\*.JPEG' '\*.jpg' `
                        mv -v "${DEEP_DIR}${FILE2//\*/}" "${DEEP_DIR}${RENAME2}"
                        FILE2=$RENAME2
                    fi
                fi
            done

            mogrify -resize 750 "$DEEP_DIR*.jpg"
            wait 
            jpegoptim "$DEEP_DIR*.jpg" –max=70 --strip-all
        fi
        if [[ $FILE != */ ]]
        then
            RENAME=`echo ${FILE//\*/} | tr ' ' '_' `
            mv -v "${DIR}${FILE//\*/}" "${DIR}${RENAME}"
            FILE=$RENAME

            RENAME2=`echo ${FILE//\*/} | tr '\*.JPEG' '\*.jpg' `
            mv -v "${DIR}${FILE//\*/}" "${DIR}${RENAME2}"
            FILE=$RENAME2   
        fi
    fi
done
if [ "$FIRST_DIR" ]
then
    mogrify -resize 750 "$DIR*.jpg"
    wait 
    jpegoptim "$DIR*.jpg" –max=70 --strip-all
fi
下面是关于bash编程的几个好链接:


难道不应该用
DIR=$(ls-t1 | head-n1)
代替
DIR=ls-t1 | head-n1
?@sgibb尝试过,但得到了相同的结果=没有结果操作
ls-t1 | head-n1
(没有任何关于DIR的内容),产生了您期望的结果?我不习惯
head-n1
语法,这是不是把它搞砸了?祝你好运。@sgibb你是对的,
$()
是必需的(我检查过它对我有用)。也许OP的机器有一个不兼容版本的
head
?谢谢Eric,我尝试了这个脚本,但我得到了很多错误:ls:无法访问3:没有这样的文件或目录:第15行:[:参数太多-第7行:[:参数太多了。基本上什么都没有发生。你在哪个操作系统上运行这个?@GrantUbuntu 11.10但最终会在CentOS@eric上运行问题是ls-lt1F上的l只要删除它,一切都会正常。所以第三行ls应该是ls-t1F@GrantTried,并得到以下内容:这里。/20120315-week\u 10\u 2012\u/brun/。/bash2.sh:linE15:[:参数太多。/bash2.sh:line 15:[:参数太多