我目前正在编写一个 bash 脚本来自动执行我的研究任务,即程序化地创建将发送到集群的多个脚本。
我的 bash 脚本由一个复制操作组成,它将复制所有文件到某个文件夹,其名称由某个过程生成,但不包括这个文件。我知道如何手动执行此操作,但在 bash 脚本中它似乎不起作用:
#!bin/sh
i=0
var=""
while [ $i -lt 6 ]
do
i=$(( $i+1 ))
var="NameOfFolder${i}"
mkdir "${var}"
cp !(fileName) "${var}"
done
我遇到的问题是cp
命令中的括号的解释不同。
我收到的错误是:
Syntax error: "(" unexpected (expecting "done")
当我删除给出命令的行时,cp
脚本运行,因此问题就出在那一行。我已经尝试过了:
#!bin/sh
i=0
var=""
while [ $i -lt 6 ]
do
i=$(( $i+1 ))
var="NameOfFolder${i}"
mkdir "${var}"
cp !((fileName)) "${var}"
done
和
#!bin/sh
i=0
var=""
while [ $i -lt 6 ]
do
i=$(( $i+1 ))
var="NameOfFolder${i}"
mkdir "${var}"
cp ( !(fileName) ) "${var}"
done
没有任何成功。
问题
在括号中引入命令的正确方法是什么,而不让 Bash 脚本将它们解释为“编程”运算符?答案1
您可以使用括号扩展创建一系列文件夹(您还需要排除文件夹本身)
#!/bin/bash
shopt -s extglob
for i in folder_{1..6}; do
mkdir -p "$i" && \
cp -t "$i" -- !(filename|${i%_*}_*)
done
答案2
您可以使用rsync
作为构造的替代cp
:例如
cp ( !(fileName) ) "${var}"
和
rsync --exclude="$fileName" * "./${var}"
该--exclude
选项rsync
使得事情变得易于管理。
答案3
您好,欢迎来到 Askubuntu!
尝试这个:
在哪里:
find
- 一种(来自 man)“在目录层次结构中搜索文件”的工具.
是您要包含的文件夹/目录(将搜索此目录下的所有子目录和子文件)-name *.ext
- 这是扩展名(文件以 .name 结尾)-type f
是一种类型文件。-exec strings {} path/to/this/copiedfiles \;
- 这个正在执行命令cp
,file 1
...file 1
,全部到last file found
path/to/this/copiedfiles
例如:
复制文件夹 /home/bob/docs/ 中所有以“.odt”结尾的文件(包括以下子目录中的所有子文件)文档/)到目录/home/bob/backups/odt/:
find /home/bob/docs/ -name "*.odt" -type f -exec cp {} /home/bob/backups/odt/{}.backup \;