shell脚本或linux命令以递归方式查找公用文件夹下的所有js / css文件

时间:2014-07-24 16:45:08

标签: linux shell

我需要帮助shell脚本或linux命令以递归方式查找公共文件夹下的所有js / css文件,然后在找到的同一目录中创建filename.min.jsm,同时将filename.js放在该文件名中。 min.jsm。

例如

public/test/a.js
public/b.js
public/test2/test3/c.js

输出:

public/test/a.js
public/test/a.min.jsm  ->  a.js is written inside of this file
public/b.js   
public/b.min.jsm   ->  b.js is written inside of this file
public/test2/test3/c.js
public/test2/test3/c.min.jsm   c.js is written inside of this file

3 个答案:

答案 0 :(得分:1)

创建以下脚本:

#!/bin/bash
filename=$1
path=${filename%/*}
basename=${filename##*/}
prefix=${basename%%.*}
echo "$basename" > "$path/$prefix".min.jsm

然后,运行

find -name '*.js' -exec /path/to/script.sh {} \;

目前还不清楚你想用css文件做什么,但这留给了读者练习。

答案 1 :(得分:1)

您可以尝试以下脚本:

#!/bin/bash

export MY_TMPDIR=$(mktemp -d)
trap 'rm -rf ${MY_TMPDIR}' EXIT

export fstyle_tmp="${MY_TMPDIR}/fstyle"

find /* -regextype posix-extended -regex '.+\.(js|css)' > "${fstyle_tmp}"

while read line; do

    line2=$(echo "${line}" | sed -e 's/\.js$//' -e 's/\.css$//')
    cp "${line}" "${line2}.min.jsm"

done < "${fstyle_tmp}"

exit 0

#EOF

如果您不想复制CSS内容更改:

line2=$(echo "${line}" | sed -e 's/\.js$//' -e 's/\.css$//')
cp "${line}" "${line2}.min.jsm"

有关:

line2=$(echo "${line}" | sed -e 's/\.js$//' -e 's/\.css$//')

if [[ "${line}" =~ \.js$ ]]; then
   cp "${line}" "${line2}.min.jsm"
else
   touch "${line2}.min.jsm"
fi

答案 2 :(得分:0)

以下是@ choroba答案的简单重构,它内联shell脚本,因此您不需要单独的文件。

find \( -name '*.js' -o -name '*.css' \) -exec sh -c '
    filename=$1
    path=${filename%/*}
    basename=${filename##*/}
    prefix=${basename%%.*}
    echo "$basename" > "$path/$prefix".min.jsm
    ' _ {} \;

我添加了-o -name '*.css'和一组用于对条件进行分组的括号。如果您不想在CSS文件上运行此操作,请还原该更改,或者向嵌入式shell脚本代码段添加条件。