如何用shell获取linux目录下的文件名呢?

时间:2021-10-29 21:37:04
遇到一个很繁琐的事情,有两个目录a、b,两个文件夹目录里有一些文件的文件名是一样,不过后缀名不同,我想把a文件夹下跟b文件夹里相同文件名的文件覆盖到b去,并删除b里同名而不同后缀的文件,文件很多,我想用shell来试写这样一个功能,不过本人刚接触shell,还不清除怎么用shell来获取目录下的文件名来进行操作,所以请教一下大家:)

15 个解决方案

#1


自己思考一下完全能写出来
首先ls得到a文件夹下的所有文件 保存到变量
然后循环该变量  截取变量扩张名之前的文件名  测试b目录是否存在该文件
如果有直接mv覆盖

#2


睡了  明天还没写出来的话  再帮你写

#3


51分诶。

留给熊猫了。 如何用shell获取linux目录下的文件名呢?

#4


FOLDER_A=a
FOLDER_B=b
for file_a in ${FOLDER_A}/*; do
  file_a_prefix=${file_a:%.*}
  file_prefix=${file_a_prefix:#${FOLDER_A}/*}
  rm -f $FOLDER_B/${file_prefix}.*
  cp $file_a $FOLDER_B/
done

看懂再用,胡乱就用俺不对后果负责。

#5


引用 3 楼 iisbsd 的回复:
51分诶。

留给熊猫了。

呵呵。。。

#6


引用 3 楼 iisbsd 的回复:
51分诶。

留给熊猫了。

额,本人很少在论坛发铁,51分是我最多分了:(

#7


引用 1 楼 steptodream 的回复:
自己思考一下完全能写出来
首先ls得到a文件夹下的所有文件 保存到变量
然后循环该变量  截取变量扩张名之前的文件名  测试b目录是否存在该文件
如果有直接mv覆盖

怎么写把ls得到的数据保存在变量,我试了这样写“fArr=ls /home/test/",然后循环打印出来说“/home/test/”是一个目录的错误。。。

#8


>for file_a in ${FOLDER_A}/*; do
这句是标准的。用for f in `ls`的话如果文件名中间有空格乃就傻掉了。

#9


引用 3 楼 iisbsd 的回复:
51分诶。

留给熊猫了。

哈哈  
有人已经给他写了   如何用shell获取linux目录下的文件名呢?
我给你回信息了

#10


熊猫一天睡多久啊?

#11


引用 10 楼 xiaopei1982 的回复:
熊猫一天睡多久啊?

8个小时以上  刚起来不久
因为是网管  所以昨晚半夜有个服务器有状况了   对应完了顺便来CSDN逛了一圈 如何用shell获取linux目录下的文件名呢?

#12


引用 4 楼 fancymouse 的回复:
FOLDER_A=a
FOLDER_B=b
for file_a in ${FOLDER_A}/*; do
  file_a_prefix=${file_a:%.*}
  file_prefix=${file_a_prefix:#${FOLDER_A}/*}
  rm -f $FOLDER_B/${file_prefix}.*
  cp $file_a $FOLDER_B/
don……

我试运行了下你的代码,出现这错误:“line 5: file_a: %.*: 语法出错:此处需要运算符 (error token is "%.*")”
运行代码是COPY你的,如下,应该没COPY错吧:(,什么问题呢?

#!/bin/bash
FOLDER_A=/home/joe/test/a
FOLDER_B=/home/joe/test/b
for file_a in ${FOLDER_A}/*; do
    file_a_prefix=${file_a:%.*}
    file_prefix=${file_a_prefix:#${FOLDER_A}/*}
    #rm -f $FOLDER_B/${file_prefix}.*
    cp $file_a $FOLDER_B/
done

#13


多加了个:
俺也不知道俺为啥会打上去,俺回帖一般直接文本框里打代码的,所以有错不奇怪~。。。

#14


又遇到一个小问题:(
文件夹名有空号,会出现目录路径不正确的怪异问题?这个有解决的方法吗?现在只能把有空格的文件夹名改掉。。。

#15


chr1:016807232-016807291 chr1 16807232 16807291 1.8139397E-4
chr1:155702807-155702857 chr1 155702807 155702857 3.7200723E-4
chr1:155702922-155702972 chr1 155702922 155702972 5.493816E-6
chr1:155703186-155703230 chr1 155703186 155703230 3.228738E-8
chr1:155703492-155703542 chr1 155703492 155703542 1.444196E-6
chr11:050088593-050088641 chr11 50088593 50088641 8.891017E-4
chr12:014983991-014984050 chr12 14983991 14984050 9.886511E-4
chr15:041445488-041445541 chr15 41445488 41445541 4.6693077E-4
chr17:003326997-003327056 chr17 3326997 3327056 2.554111E-4
chr18:042638861-042638911 chr18 42638861 42638911 8.925676E-4
chr18:042638998-042639057 chr18 42638998 42639057 6.165054E-4
chr2:118637869-118637913 chr2 118637869 118637913 7.7874516E-4
chr2:118637997-118638045 chr2 118637997 118638045 4.16375E-4

chr1:155703186-155703230 chr1 155703186 155703230 7.146314E-4
chr13:051623104-051623163 chr13 51623104 51623163 3.2926044E-5
chr13:051623263-051623322 chr13 51623263 51623322 6.2484184E-4
chr14:061931820-061931879 chr14 61931820 61931879 7.556271E-4
chr8:059277877-059277936 chr8 59277877 59277936 9.458363E-5

#1


自己思考一下完全能写出来
首先ls得到a文件夹下的所有文件 保存到变量
然后循环该变量  截取变量扩张名之前的文件名  测试b目录是否存在该文件
如果有直接mv覆盖

#2


睡了  明天还没写出来的话  再帮你写

#3


51分诶。

留给熊猫了。 如何用shell获取linux目录下的文件名呢?

#4


FOLDER_A=a
FOLDER_B=b
for file_a in ${FOLDER_A}/*; do
  file_a_prefix=${file_a:%.*}
  file_prefix=${file_a_prefix:#${FOLDER_A}/*}
  rm -f $FOLDER_B/${file_prefix}.*
  cp $file_a $FOLDER_B/
done

看懂再用,胡乱就用俺不对后果负责。

#5


引用 3 楼 iisbsd 的回复:
51分诶。

留给熊猫了。

呵呵。。。

#6


引用 3 楼 iisbsd 的回复:
51分诶。

留给熊猫了。

额,本人很少在论坛发铁,51分是我最多分了:(

#7


引用 1 楼 steptodream 的回复:
自己思考一下完全能写出来
首先ls得到a文件夹下的所有文件 保存到变量
然后循环该变量  截取变量扩张名之前的文件名  测试b目录是否存在该文件
如果有直接mv覆盖

怎么写把ls得到的数据保存在变量,我试了这样写“fArr=ls /home/test/",然后循环打印出来说“/home/test/”是一个目录的错误。。。

#8


>for file_a in ${FOLDER_A}/*; do
这句是标准的。用for f in `ls`的话如果文件名中间有空格乃就傻掉了。

#9


引用 3 楼 iisbsd 的回复:
51分诶。

留给熊猫了。

哈哈  
有人已经给他写了   如何用shell获取linux目录下的文件名呢?
我给你回信息了

#10


熊猫一天睡多久啊?

#11


引用 10 楼 xiaopei1982 的回复:
熊猫一天睡多久啊?

8个小时以上  刚起来不久
因为是网管  所以昨晚半夜有个服务器有状况了   对应完了顺便来CSDN逛了一圈 如何用shell获取linux目录下的文件名呢?

#12


引用 4 楼 fancymouse 的回复:
FOLDER_A=a
FOLDER_B=b
for file_a in ${FOLDER_A}/*; do
  file_a_prefix=${file_a:%.*}
  file_prefix=${file_a_prefix:#${FOLDER_A}/*}
  rm -f $FOLDER_B/${file_prefix}.*
  cp $file_a $FOLDER_B/
don……

我试运行了下你的代码,出现这错误:“line 5: file_a: %.*: 语法出错:此处需要运算符 (error token is "%.*")”
运行代码是COPY你的,如下,应该没COPY错吧:(,什么问题呢?

#!/bin/bash
FOLDER_A=/home/joe/test/a
FOLDER_B=/home/joe/test/b
for file_a in ${FOLDER_A}/*; do
    file_a_prefix=${file_a:%.*}
    file_prefix=${file_a_prefix:#${FOLDER_A}/*}
    #rm -f $FOLDER_B/${file_prefix}.*
    cp $file_a $FOLDER_B/
done

#13


多加了个:
俺也不知道俺为啥会打上去,俺回帖一般直接文本框里打代码的,所以有错不奇怪~。。。

#14


又遇到一个小问题:(
文件夹名有空号,会出现目录路径不正确的怪异问题?这个有解决的方法吗?现在只能把有空格的文件夹名改掉。。。

#15


chr1:016807232-016807291 chr1 16807232 16807291 1.8139397E-4
chr1:155702807-155702857 chr1 155702807 155702857 3.7200723E-4
chr1:155702922-155702972 chr1 155702922 155702972 5.493816E-6
chr1:155703186-155703230 chr1 155703186 155703230 3.228738E-8
chr1:155703492-155703542 chr1 155703492 155703542 1.444196E-6
chr11:050088593-050088641 chr11 50088593 50088641 8.891017E-4
chr12:014983991-014984050 chr12 14983991 14984050 9.886511E-4
chr15:041445488-041445541 chr15 41445488 41445541 4.6693077E-4
chr17:003326997-003327056 chr17 3326997 3327056 2.554111E-4
chr18:042638861-042638911 chr18 42638861 42638911 8.925676E-4
chr18:042638998-042639057 chr18 42638998 42639057 6.165054E-4
chr2:118637869-118637913 chr2 118637869 118637913 7.7874516E-4
chr2:118637997-118638045 chr2 118637997 118638045 4.16375E-4

chr1:155703186-155703230 chr1 155703186 155703230 7.146314E-4
chr13:051623104-051623163 chr13 51623104 51623163 3.2926044E-5
chr13:051623263-051623322 chr13 51623263 51623322 6.2484184E-4
chr14:061931820-061931879 chr14 61931820 61931879 7.556271E-4
chr8:059277877-059277936 chr8 59277877 59277936 9.458363E-5