2014-07-24 266 views
-1

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

例如

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 
+1

发布您尝试过的代码,然后我们可以尝试提出任何更改或提出一些补充。 –

+1

@charles babbage我是shell脚本新手,这里是我尝试过的“find。-type f -name”* .js“-exec echo {}> {} .min.jsm”,这不是我所期望的。 –

+0

可能重复[Linux查找命令gotcha?](http://stackoverflow.com/questions/2591158/linux-find-command-gotcha) – tripleee

回答

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脚本片段添加条件。

+0

指向@choroba为基础。 – tripleee

+0

谢谢,只有一件事你忘了路径。但我认为这很好。找 。 \(-name'* .js'-o -name'* .css'\)-exec sh -c' filename = $ 1 path = $ {filename%/ *} basename = $ {filename ## */} prefix = $ {basename %%。*} echo“$ basename”>“$ path/$ prefix”.min.jsm '_ {} \; –

+0

Linux上的路径参数是可选的;它默认为当前目录。但是,对于可移植性来说,无论如何,包括它是很好的。 – tripleee

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文件做什么,但这留给读者作为练习。

+0

无论如何,它只是命令?我们有点不想保留任何文件。 –

+0

@JinLin:所以一旦文件被处理就删除它。 – choroba

+0

似乎我们无法同时运行js和css。我尝试运行“”查找。 -name“* .js”-o -name“* .css”-exec /path/to/script.sh {} \;它只会生成一个CSS。 –

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 
+0

你可以让它只是一个命令? –

+0

@JinLin你不能用一个命令来完成它,它们可能不止一个结果,这意味着你需要循环它。您可以使用脚本并在删除它之后。 – Steve

相关问题