热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux——将文件夹内所有同种类型文件移入到另一个文件夹中

Linux——将文件夹内所有同种类型文件移入到另一个文件夹中-小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。Linux中一切皆文件摘要由于工作需要,我需要把一

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Linux中一切皆文件

摘要

由于工作需要,我需要把一个文件目录A中所有的普通文件移动到另一个目录中,但是问题是,这个文件目录A中有各种类型的文件(目录文件,链接文件等),如何用shell命令实现我的需求呢?本文涉及到awk,ls,$()的使用。

背景及需求

由于工作需要,我需要把一个文件目录A中所有的普通文件移动到另一个目录中,但是问题是,这个文件目录A中有各种类型的文件(目录文件,链接文件等),如何用shell命令实现我的需求呢?

简化需求,如下图,需要将test文件夹中test1,test2,test3文件移入到test4文件夹中,为了方便起见以test命令,实际可能为没有规则的文件名

思路分析

  • 找到test文件夹中所有普通文件
  • 将其移动到test4文件

如何找到文件夹中所有文件

ls -l +管道符配合grep查看当前目录下某种类型的文件
root@VM-8-17-ubuntu:/tmp/test# ls -l
total 4
-rw-r--r-- 1 root root    0 Oct  2 11:18 test1
-rw-r--r-- 1 root root    0 Oct  2 11:18 test2
-rw-r--r-- 1 root root    0 Oct  2 11:18 test3
drwxr-xr-x 2 root root 4096 Oct  3 11:05 test4
root@VM-8-17-ubuntu:/tmp/test# ls -l |grep ^-
-rw-r--r-- 1 root root    0 Oct  2 11:18 test1
-rw-r--r-- 1 root root    0 Oct  2 11:18 test2
-rw-r--r-- 1 root root    0 Oct  2 11:18 test3
  • 使用ls -l显示文件夹中文件的长格式,第一个字符为文件类型
  • ^表示第一个字符,$表示最后一个字符,可以使用通配符来做筛选
  • 这个方法也可以比较通用,也可以查看当前文件夹中全部目录,全部块文件,全部链接
补充 ls -d的用法
  • ls -d 可以查看当前目录下

  • 直接使用ls -d会查看到当前目录,一般可以使用ls -ld查看当前目录的属性

    root@VM-8-17-ubuntu:/tmp/test# ls -ld
    drwxr-xr-x 3 root root 4096 Oct  3 11:05 .
    root@VM-8-17-ubuntu:/tmp/test# ls -d
    .
  • 查看当前目录下所有文件夹的话可以使用ls -d */ ,这种方法文件夹名称后面会带一个/,用法和ls -F很像

    root@VM-8-17-ubuntu:/tmp/test# ls -d */
    test4/
补充ls -F的用法

在shell中ls -F是一个很有用的命令:把文件按照类型归类,主要区分目录文件、可执行文件、链接文件,并且在末尾加上 / 、*、@符号标识

  • 对于可执行文件,在后面加上一个*

  • 对于目录文件,在后面加上一个/

  • 对于符号链接文件,在后面加上一个@

  • 对于普通文件,后面没有不会加内容

    可以使用ls -F +管道符配合grep来查看当前目录下某种类型的文件

root@VM-8-17-ubuntu:/tmp/test# ls -l
total 4
-rw-r--r-- 1 root root    0 Oct  2 11:18 test1
-rw-r--r-- 1 root root    0 Oct  2 11:18 test2
-rw-r--r-- 1 root root    0 Oct  2 11:18 test3
drwxr-xr-x 2 root root 4096 Oct  3 11:05 test4
lrwxrwxrwx 1 root root    5 Oct  3 11:22 test5 -> test1
-rwxr-xr-x 1 root root    0 Oct  3 11:18 test5.sh
root@VM-8-17-ubuntu:/tmp/test# ls -F
test1  test2  test3  test4/  test5@  test5.sh*
# 查看当前目录下可执行文件
root@VM-8-17-ubuntu:/tmp/test# ls -F | grep *$
test5.sh*
# 查看当前目录下目录文件
root@VM-8-17-ubuntu:/tmp/test# ls -F | grep /$
test4/
# 查看当前目录下符号链接文件
root@VM-8-17-ubuntu:/tmp/test# ls -F | grep @$
test5@
# 查看当前目录下普通文件
root@VM-8-17-ubuntu:/tmp/test# ls -F | grep -v [/*@]$
test1
test2
test3

如何把找到的文件移动到目标目录内

  1. 使用mv可以将目标文件移动到目标目录中,用法:mv [OPTION]... SOURCE... DIRECTORY

  2. 需要把上一步找到的文件作为SOURCE

使用awk从长格式中得到所需文件的文件名

awk的用法Linux awk 命令 | 菜鸟教程 (runoob.com)

对于2,我们在如何找到文件夹中所有文件中的得到的是长格式的内容,因此可以使用awk命令来找到对应的文件。

root@VM-8-17-ubuntu:/tmp/test# ls -l
total 4
-rw-r--r-- 1 root root    0 Oct  2 11:18 test1
-rw-r--r-- 1 root root    0 Oct  2 11:18 test2
-rw-r--r-- 1 root root    0 Oct  2 11:18 test3
drwxr-xr-x 2 root root 4096 Oct  3 11:48 test4
lrwxrwxrwx 1 root root    5 Oct  3 11:22 test5 -> test1
-rwxr-xr-x 1 root root    0 Oct  3 11:18 test5.sh
root@VM-8-17-ubuntu:/tmp/test# ls -l |grep ^- |awk '{print $9}'
test1
test2
test3
test5.sh
使用$()或者``做命令替换
  • 在bash中,$( )``(反引号)都是用来作命令替换的。
  • 命令替换与变量替换差不多,都是用来重组命令行的,先完成引号里的命令行,然后将其结果替换出来,再重组成新的命令行。
  • 因此,我们可以使用$( )``来做命令替换后得到结果作为mv的SOURCE
root@VM-8-17-ubuntu:/tmp/test# ls -l
total 4
-rw-r--r-- 1 root root    0 Oct  2 11:18 test1
-rw-r--r-- 1 root root    0 Oct  2 11:18 test2
-rw-r--r-- 1 root root    0 Oct  2 11:18 test3
drwxr-xr-x 2 root root 4096 Oct  3 11:48 test4
-rwxr-xr-x 1 root root    0 Oct  3 11:18 test5.sh
# 移动文件至test4文件目录中
root@VM-8-17-ubuntu:/tmp/test# mv `ls -l | grep ^- | awk '{print $9}'` test4
# 查看到之前的文件已经移动到了test目录中
root@VM-8-17-ubuntu:/tmp/test# ls -lR
.:
total 4
drwxr-xr-x 2 root root 4096 Oct  3 12:01 test4

./test4:
total 0
-rw-r--r-- 1 root root 0 Oct  2 11:18 test1
-rw-r--r-- 1 root root 0 Oct  2 11:18 test2
-rw-r--r-- 1 root root 0 Oct  2 11:18 test3
-rwxr-xr-x 1 root root 0 Oct  3 11:18 test5.sh

推荐阅读
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Java程序员必会的40个Linux命令!
    你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 文章目录一、awk简介二、awk的两种形式语法格式1options:2command:三、awk工作原理四、记录与字段相关内部变量:五、格式化输出:printf函数六、awk模式和 ... [详细]
  • linux 循环 cpu使用率脚本,Linux Shell脚本监视CPU利用率,达到设置的CPU利用率时发送电子邮件...
    有很多开源监控工具可用于监控Linux系统性能,当系统达到给定的阈值限制时,它将发送电子邮件警报。它监视CPU利用率、内存利用率、交换利用率、磁盘空间利 ... [详细]
  • 1.判断磁盘使用空间df-h|grep-vFile|seds%g|awk{if($580)print使用空间超过了80%:,$6}或#!binbash#Filename:di ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 作者|JiekeXu来源|JiekeXu之路(ID:JiekeXu_IT)转载请联系授权|(微信ID:xxq1426321293)大家好,我是Jieke ... [详细]
  • 动手写一个OpenVPN的wrapper来优化OpenVPN性能
    动手写一个OpenVPN的wrapper来优化OpenVPN性能 ... [详细]
  • BashShell作为Linux的指定合作伙伴我们已经再熟悉不过了,使用Bash可以快速编写简单的脚本方便我们的日常比如善用vim,awk和sed三剑客,也可以创建十分复杂的逻辑, ... [详细]
  • 用聪明的方式学习 Vim
    来自量子位Vim难学难用?但事实是,它依旧受许多程序员的欢迎。或许,只是你的「打开方式」不对。最近,在GitHub上便出现了 ... [详细]
  •  1.在将一个表unload时,出现:244:Couldnotdoaphysical-orderreadtofetchnextrow107:ISAMerror:recordislocked在不重启动数据库 ... [详细]
  • 转载请注明出处:http:blog.csdn.netl1028386804articledetails78666356直接上代码:#!binsh##j ... [详细]
  • 关于中间件服务的配置管理,分为5个阶段
    这是学习笔记的第 2185 篇文章读完需要9分钟速读仅需7分钟一直以来对于中间件服务的配置管理是一个有些头疼的事情,但是头疼还不意味着解决不了,目前现状是:中间件配置的管理是手工方 ... [详细]
author-avatar
用户um940d5n0q
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有