Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于复制和重命名多个文件的Linux shell脚本_Shell - Fatal编程技术网

用于复制和重命名多个文件的Linux shell脚本

用于复制和重命名多个文件的Linux shell脚本,shell,Shell,我有一段话: #!/bin/bash parent=/parent newfolder=/newfolder mkdir "$newfolder" for folder in "$parent"/*; do if [[ -d $folder ]]; then foldername="${folder##*/}" for file in "$parent"/"$foldername"/*; do filename="${file##*/}" newfilename="$foldername"_"$

我有一段话:

#!/bin/bash
parent=/parent
newfolder=/newfolder
mkdir "$newfolder"
for folder in "$parent"/*; do
if [[ -d $folder ]]; then
foldername="${folder##*/}"
for file in "$parent"/"$foldername"/*; do
filename="${file##*/}"
newfilename="$foldername"_"$filename"
cp "$file" "$newfolder"/"$newfilename"
done
fi
done
我确实需要以一种方式改变它,即复制的文件将以其移动到的文件夹命名(例如,移动到/root/Case22文件将重命名为Case22_1.jpg、Case22_2.docx、Case22_3.jpg等)。文件将从USB复制,用户将输入目标和源目录。我已经写了所有的东西,除了实际的重命名,它还能工作,我想我可以修改这个片段

谢谢


p、 这段代码是Jahid写的,可以在stackoverflow上找到,你可以试试这样的东西

#!/bin/bash
parent=/root
a=1
for file in $parent/Case22*; do
filename="${file%.*}"
extension="${file##*.}"
  newfilename=$(printf "$filename"_"$a"."$extension") 
  mv -- "$file" "$newfilename"
  let a=a+1
done

谢谢你的帮助。我已经找到了解决方案,我想我可能会把它贴在这里,以防其他人看到这个。 正如标题所示,我需要一个LinuxShell脚本来复制和重命名多个保持原始目录树的文件(文件源和归档位置将由脚本用户指定)。以下是我经过几天对不同来源的研究后得出的代码(它包括一个陷阱,因此一次只能运行一个脚本实例):

lockdir=/var/tmp/mylock#用于创建锁文件的目录
pidfile=/var/tmp/mylock/pid#目录以获取进程ID号
if(mkdir${lockdir})2>/dev/null;然后#主参数创建锁文件
echo$$>$pidfile#如果脚本成功,则将继续执行,否则将跳到脚本末尾语句的else部分
陷阱“rm-rf”$lockdir;exit$?'INT TERM exit#陷阱,用于捕获脚本终止和移除锁定文件的原因,以便再次启动
#主脚本正文的开头,成功的“if”语句的一部分
#读取条目_用于_测试#请求用户条目以保持脚本运行并尝试运行另一个脚本实例
findir=“$2/$(basename“$1”)”#变量,用于定义将USB文件复制到的最终目录
如果[!-d“$1”];然后#测试第一个目录条目是否为有效目录“”
echo“$1”不是目录
回声“”
出口
其他的
如果[!-d“$2”];然后#测试第二个条目是否为有效目录
echo“存档目录不存在”
出口
其他的
如果[-d“$findir”]&&[“$(ls-A“$findir”)”];然后#测试第二个条目目录是否包含同名文件夹以及文件夹是否为空-以避免文件覆盖
echo“这样的文件夹已经存在并且不是空的”
出口
其他的
如果[!-d“$findir”];然后#使用最后一个存档目录参数创建最终存档目录
mkdir“$findir”
否则是真的
fi
fi
fi
fi
rsync—一个“$1”/“$findir”#命令,用于将所有文件从源文件复制到保留目录树的存档文件
moved_files=“$(find“$findir”-type f)”#变量,用于查找已复制到存档目录的所有文件
对于$moved_文件中的文件;开始重命名复制文件的循环
计数器=“$((计数器+1))”#递增变量
source_name=“$(basename“$1”)”#捕获源目录名称的变量
new_name=“$source_name”“$counter”#将文件名开头和递增元素放在一起的变量
if echo“$file”| grep“\.”参数,用于捕获文件扩展名
然后
扩展名=“$(echo“$file”| cut-f2-d)”
其他的
延伸=
fi
full_name=“$new_name”。$extension”#定义文件最终新名称的变量
dir=“$(dirname“${file}”)”变量,用于捕获当前循环文件的directorry地址
mv“$file”“$dir/$full_name”#move命令以最终新名称重命名当前循环文件
完成
#在主脚本正文的末尾,此处继续执行不成功的“if”语句
其他的
echo“此脚本的另一个实例已在运行。PID:$(cat$pidfile)”

fi
这不是代码编写服务。您尝试添加重新编号的内容,我们(可能)尝试帮助修复它。@Marc感谢您的建设性批评。我被stackoverflow中的一些帖子和答案误导,迷路了;)可能重复的、、等标记为已接受,因为它正在工作,并且做了它必须做的事情。但这并不意味着它是实现所需结果的最优雅或最佳方式。