求达人编写个shell

时间:2021-10-22 08:49:24
    任务:把一个文件夹下子目录中所有的jpg文件拷到桌面,文件名相同的不要覆盖。
    
     下面是我自己写的一条指令:

find ~/Music/Nightwish\ wish/ -name *.jpg -exec cp {} ~/Desktop \;

    但是它用新的文件覆盖了所有的同名文件了,我想通过设定一个变量做文件名 ,每执行一次自增一,但不知道该怎么在同一条指令里实现自增和复制,求助。

还有一点上面的指令中{}符号有哪些用法?

15 个解决方案

#1


我不是达人……

#2


这个不好做,不知道多个子目录中有相同的文件名的,到底哪个先拷贝到桌面呢?
这个shell还是写个脚本文件,长一点,对每个目录递归ls *.jpg,for循环把ls的结果cp到桌面,cp之前先判断桌面是否有该文件名了吗。 这样写出来的shell脚本估计比较长。

还是期待高手吧。另,可以去linux版问。

#3


该回复于2010-03-26 11:32:54被版主删除

#4


引用 2 楼 cattycat 的回复:
这个不好做,不知道多个子目录中有相同的文件名的,到底哪个先拷贝到桌面呢?
这个shell还是写个脚本文件,长一点,对每个目录递归ls *.jpg,for循环把ls的结果cp到桌面,cp之前先判断桌面是否有该文件名了吗。 这样写出来的shell脚本估计比较长。

还是期待高手吧。另,可以去linux版问。


哦,我还不知道有一个Linux得板块,我一直都觉得c语言板块卧虎藏龙,有无数的万能的人才

#5


LZ指的不要覆盖是什么意思? 就是从新命名呗? 那就做个从命判断,然后+1的从新命名就可以了啊

#6


引用 5 楼 htool 的回复:
LZ指的不要覆盖是什么意思? 就是从新命名呗? 那就做个从命判断,然后+1的从新命名就可以了啊


对对,求给出代码

#7


复制前判断下桌面是否已经有了和该文件同名的文件?

#8




INDEX=0; for AA in `find ~/Music/Nightwish\ wish/ -name *.jpg` ; do INDEX=`expr $INDEX + 1` ; cp $AA ~/Desktop/$INDEX.jpg

#9


这样可以不....

INDEX=0; for AA in `find ~/Music/Nightwish\ wish/ -name *.jpg` ; do INDEX=`expr $INDEX + 1` ; cp $AA ~/Desktop/$INDEX.jpg ; done

#10


比如下面的脚本可以列出所有的文件名赋给filename变量,以\t隔开
 filename=`ls |awk '{print "\t" $1}'`

假设现在有个文件名a.txt,那么从上面的变量中找这个变量名就可以判断是否存在该文件,或者可以用awk的正则表达式来匹配

#11


任务:把一个文件夹下子目录中所有的jpg文件拷到桌面,文件名相同的不要覆盖。

#!/bin/sh

for i in .; do
  echo "cp $i"
  if [ -e ~/Desktop/$i ]; then
     continue;
  fi;
  cp $i ~/Desktop/;
done

#12


呵呵,饭要一口一口吃,事情要一步一步来。

首先,不要调用系统的 cp 命令,换成你自己写的 CopyFile 命令:
find ~/Music/Nightwish\ wish/ -name *.jpg -exec  CopyFile {} ~/Desktop \;

然后,在你自己写的 CopyFile 命令里,

 1 生成带路径的目标文件名
 2 测试目标文件是否存在
   2.1 文件存在就在文件名上增加一个数字,转第二步
 3 第二步保证了目标文件不存在,那么就用 cp 完成拷贝


#13


引用 12 楼 icansaymyabc 的回复:
呵呵,饭要一口一口吃,事情要一步一步来。

首先,不要调用系统的 cp 命令,换成你自己写的 CopyFile 命令:
find ~/Music/Nightwish\ wish/ -name *.jpg -exec CopyFile {} ~/Desktop \;

然后,在你自己写的 CopyFile 命令里,

1 生成带路径的目标文件名
2 测试目标文件是否存在
2.1 文……


这个不错!
呵呵楼主的问题是在windows上的,答案都有linux上的了呵呵

#14


引用 9 楼 mlee79 的回复:
这样可以不....

INDEX=0; for AA in `find ~/Music/Nightwish\ wish/ -name *.jpg` ; do INDEX=`expr $INDEX + 1` ; cp $AA ~/Desktop/$INDEX.jpg ; done


这个不可以,应为我的路径里面有空格,这样就会错误了。

#15


引用 12 楼 icansaymyabc 的回复:
呵呵,饭要一口一口吃,事情要一步一步来。

首先,不要调用系统的 cp 命令,换成你自己写的 CopyFile 命令:
find ~/Music/Nightwish\ wish/ -name *.jpg -exec CopyFile {} ~/Desktop \;

然后,在你自己写的 CopyFile 命令里,

1 生成带路径的目标文件名
2 测试目标文件是否存在
2.1 ……


自己写copy阿,这个好主意呀。有空试试看

#1


我不是达人……

#2


这个不好做,不知道多个子目录中有相同的文件名的,到底哪个先拷贝到桌面呢?
这个shell还是写个脚本文件,长一点,对每个目录递归ls *.jpg,for循环把ls的结果cp到桌面,cp之前先判断桌面是否有该文件名了吗。 这样写出来的shell脚本估计比较长。

还是期待高手吧。另,可以去linux版问。

#3


该回复于2010-03-26 11:32:54被版主删除

#4


引用 2 楼 cattycat 的回复:
这个不好做,不知道多个子目录中有相同的文件名的,到底哪个先拷贝到桌面呢?
这个shell还是写个脚本文件,长一点,对每个目录递归ls *.jpg,for循环把ls的结果cp到桌面,cp之前先判断桌面是否有该文件名了吗。 这样写出来的shell脚本估计比较长。

还是期待高手吧。另,可以去linux版问。


哦,我还不知道有一个Linux得板块,我一直都觉得c语言板块卧虎藏龙,有无数的万能的人才

#5


LZ指的不要覆盖是什么意思? 就是从新命名呗? 那就做个从命判断,然后+1的从新命名就可以了啊

#6


引用 5 楼 htool 的回复:
LZ指的不要覆盖是什么意思? 就是从新命名呗? 那就做个从命判断,然后+1的从新命名就可以了啊


对对,求给出代码

#7


复制前判断下桌面是否已经有了和该文件同名的文件?

#8




INDEX=0; for AA in `find ~/Music/Nightwish\ wish/ -name *.jpg` ; do INDEX=`expr $INDEX + 1` ; cp $AA ~/Desktop/$INDEX.jpg

#9


这样可以不....

INDEX=0; for AA in `find ~/Music/Nightwish\ wish/ -name *.jpg` ; do INDEX=`expr $INDEX + 1` ; cp $AA ~/Desktop/$INDEX.jpg ; done

#10


比如下面的脚本可以列出所有的文件名赋给filename变量,以\t隔开
 filename=`ls |awk '{print "\t" $1}'`

假设现在有个文件名a.txt,那么从上面的变量中找这个变量名就可以判断是否存在该文件,或者可以用awk的正则表达式来匹配

#11


任务:把一个文件夹下子目录中所有的jpg文件拷到桌面,文件名相同的不要覆盖。

#!/bin/sh

for i in .; do
  echo "cp $i"
  if [ -e ~/Desktop/$i ]; then
     continue;
  fi;
  cp $i ~/Desktop/;
done

#12


呵呵,饭要一口一口吃,事情要一步一步来。

首先,不要调用系统的 cp 命令,换成你自己写的 CopyFile 命令:
find ~/Music/Nightwish\ wish/ -name *.jpg -exec  CopyFile {} ~/Desktop \;

然后,在你自己写的 CopyFile 命令里,

 1 生成带路径的目标文件名
 2 测试目标文件是否存在
   2.1 文件存在就在文件名上增加一个数字,转第二步
 3 第二步保证了目标文件不存在,那么就用 cp 完成拷贝


#13


引用 12 楼 icansaymyabc 的回复:
呵呵,饭要一口一口吃,事情要一步一步来。

首先,不要调用系统的 cp 命令,换成你自己写的 CopyFile 命令:
find ~/Music/Nightwish\ wish/ -name *.jpg -exec CopyFile {} ~/Desktop \;

然后,在你自己写的 CopyFile 命令里,

1 生成带路径的目标文件名
2 测试目标文件是否存在
2.1 文……


这个不错!
呵呵楼主的问题是在windows上的,答案都有linux上的了呵呵

#14


引用 9 楼 mlee79 的回复:
这样可以不....

INDEX=0; for AA in `find ~/Music/Nightwish\ wish/ -name *.jpg` ; do INDEX=`expr $INDEX + 1` ; cp $AA ~/Desktop/$INDEX.jpg ; done


这个不可以,应为我的路径里面有空格,这样就会错误了。

#15


引用 12 楼 icansaymyabc 的回复:
呵呵,饭要一口一口吃,事情要一步一步来。

首先,不要调用系统的 cp 命令,换成你自己写的 CopyFile 命令:
find ~/Music/Nightwish\ wish/ -name *.jpg -exec CopyFile {} ~/Desktop \;

然后,在你自己写的 CopyFile 命令里,

1 生成带路径的目标文件名
2 测试目标文件是否存在
2.1 ……


自己写copy阿,这个好主意呀。有空试试看