如何用shell批量移动子目录下文件到当前文件夹 255

我有一个文件夹,底下有很多子目录,子目录下有些有文件有些没文件,我想把这些子目录下的文件通过shell全部移动到当前目录,然后如果有重名情况,自动在原文件名上面加个编号什... 我有一个文件夹,底下有很多子目录,子目录下有些有文件有些没文件,我想把这些子目录下的文件通过shell全部移动到当前目录,然后如果有重名情况,自动在原文件名上面加个编号什么的。不知道能不能实现。期待解答。 展开
 我来答
沉绪员
2019-08-31 · TA获得超过131个赞
知道小有建树答主
回答量:242
采纳率:65%
帮助的人:38.3万
展开全部
#!/bin/bash
rp=$(pwd)
echo rootpath-----------------:${rp}
# function
moveFile(){
# get dirs
ls -F | grep "/$" > temp_dirs.txt
cat temp_dirs.txt | while read d
#for d in $(cat temp_dirs.txt);
#while read d
do
cp=$(pwd)/${d}
cd ${cp}
echo currentPath----------------------:${cp}
   ls -al | grep "^-" > temp_files.txt
cat temp_files.txt | while read f
#for f in $(cat temp_files.txt);
#while read f
do
fileName="${f##* }"
echo filename--------------------:${fileName}
newFileName=${rp}/${d%*/}-${fileName}
echo newfilename---------------------:${newFileName}
fullPath=${cp}${fileName}
echo fullPath-------------------------:${fullPath}
mv ${fullPath} ${newFileName}
done 
#< <(ls -al | grep "^-")
# delete temp file
test -a temp_files.txt && rm -rf temp_files.txt 
#
moveFile
test -a temp_dirs.txt && rm -rf temp_dirs.txt
cd ..
done
       # < <(ls -F | grep "/$")
}
# exec
echo 'start move files ...'
moveFile
rm -rf *temp_dirs.txt
rm -rf *temp_files.txt
echo 'move files end'

技术有限,此代码效率不高;在linux测试没问题,mac上没测,你可以先测一下;文件移到根目录会被重命名为它原先所在的文件夹加上短杠加上它原先的名称

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
super_2dan
2019-09-21
知道答主
回答量:1
采纳率:0%
帮助的人:702
展开全部

`把这代码放在待转入的文件夹路径下面。

from_folder=文件夹路径

from_folder=                 ###文件夹路径,需要手写入
current_folder=$(pwd)        ###新件夹路径,与脚本在一个路径下所以不用改动


for file in $(find $from_folder)
do
[[ -d $file ]] && continue    #如果不是文件,跳过

#如果是重名, 在名字前加入路径,
#如果不重名, 直接移到现有文件夹下
if [[ -e ${file##*/} ]];then
mv $file $(echo $file | sed 's/\//_/g')  
else
mv $file .
fi 

done
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
uyghjo
2019-08-30
知道答主
回答量:1
采纳率:0%
帮助的人:710
展开全部
需要写一个函数
#!/bin/bash

function read_dir(){
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
read_dir $1"/"$file
else
echo $1"/"$file
fi
done
}

read_dir $1 > ~/txt_27316324984592

for i in $(<~/txt_27316324984592); do mv $i $2; done

rm ~/txt_27316324984592 #中间文件,存储文件路径

将代码复制到getfile.sh,chmod 777 getfile.sh
用法:path/to/getfile.sh 你要移动的文件夹路径 目标文件见路径
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wo_jiu_shi_wo_
2019-10-20 · 超过29用户采纳过TA的回答
知道答主
回答量:122
采纳率:65%
帮助的人:31万
展开全部
#!/bin/bash
#
dir=$(pwd)
echo "当前目录为$dir"
a=0
for i in `find $dir -type d`;do
if [ $i != $dir ];then
mv $i $dir
echo "移动$i 目录至$dir"
fi
done
-----------------------------------
这个可以把下一级文件夹移动到当前目录下。就是要多运行几次。还有就是同名文件无法移动。我觉得还挺实用,同名文件夹还没想好。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
橙门听X
2019-05-04 · TA获得超过2572个赞
知道大有可为答主
回答量:4669
采纳率:88%
帮助的人:715万
展开全部
1、主要是从文件名截取出日期,如果固定了位数
2、可以先按_分割取第二段
echo $file|awk -F\_ '{print $2}'
3、然后再取第4位后面的8位
4、例如:vi a.sh
#!/bin/sh
for file in `ls *.jpg`;do
echo $file
datedir=$(echo $file|awk -F\_ '{print $2}'|awk '{print substr($1,4,8)}')
mkdir $datedir
/bin/mv $file $datedir
done
追问
试了下没用啊
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式