我正在尝试编写一个移动所有文件的shell脚本,但以.py
和cd FILES/user/folder
shopt -s extglob
mv !(*.sh|*.py) MoveFolder/ 2>/dev/null
shopt -u extglob
结尾的文件除外。我也不想移动目录。
这是我到目前为止所得到的:
.sh
这将移动除.py
或MoveFolder
之外的所有文件,但所有目录也会移至var message = {
app_id: "xxxx",
contents: {"en": messages},
include_player_ids: [token],
small_icon: "resource_name", // can not be an url
large_icon: "http://url/ or resource_name"
}
。
我想我可以重命名文件夹,但是其他脚本已经为他们的工作分配了这些文件夹,因此重命名可能会给我带来更多麻烦。我也可以添加文件夹名称,但每当有人创建文件夹时,我都必须将其名称添加到脚本中,否则它也会被移动。
如何改进此脚本以跳过所有文件夹?
答案 0 :(得分:5)
使用find
:
find -maxdepth 1 \! -type d \! -name "*.py" \! -name "*.sh" -exec mv -t MoveFolder {} +
它的作用:
find
:找东西...... -maxdepth 1
:位于当前目录中...... \! -type d
:这不是目录... \! -name "*.py
:其名称不以.py
... \! -name "*.sh
:其名称不以.sh
... -exec mv -t MoveFolder {} +
:并将其移至目录MoveFolder
-exec
标志是特殊的:与作为条件的先前标志相反,这是一个动作。对于每个匹配,结束以下命令的+
会指示find
在命令末尾聚合文件名,标记为{}
的位置。找到所有文件后,find
执行生成的命令(即mv -t MoveFolder file1 file2 ... fileN
)。
答案 1 :(得分:1)
您必须检查每个元素以查看它是否是目录,以及它的扩展名:
for f in FILES/user/folder/*
do
extension="${f##*.}"
if [ ! -d "$f" ] && [[ ! "$extension" =~ ^(sh|py)$ ]]; then
mv "$f" MoveFolder
fi
done
否则,您也可以使用find -type f
并使用maxdepth
和正则表达式执行某些操作。
基于Check if a string matches a regex in Bash script的文件名的正则表达式,通过解决方案提取的扩展名为Extract filename and extension in Bash。