简单的shell脚本编程练习之移动指定大小文件

编写 shell 脚本,将当前目录下大于 10K 的文件转移到./tmp 目录下

目录

编写 shell 脚本,将当前目录下大于 10K 的文件转移到./tmp 目录下

法一:直接在文件夹里find,然后移入指定文件夹

法二:先find出目标文件,再循环放入

法三:文件夹里循环找目标文件,判断语句有点绕,用了du与cut

法四:利用ls与awk配合管道循环里将目标文件放入


法一:直接在文件夹里find,然后移入指定文件夹

#!/bin/bash 
read -p "Please enter the directory_name you want to store" directory_name
#read与用户交互,让用户输入文件名,-p是将用户输入的文件名传给directory_name
if [ ! -d "./${directory_name}" ];then
#判断这个目录是否存在,不存在就创建
  mkdir ./${directory_name} 
fi   
find . -type f -size +10k -exec mv {} ./${directory_name} \;
  • find 命令用于查找文件
  • . 表示查找当前目录下的文件,也可以指定其他目录
  • -type f 表示只查找普通文件,不包括目录等其他特殊文件类型
  • -size +10k 表示查找大小大于 10K 的文件,+ 表示查找大于等于 10K 的文件,- 表示查找小于等于 10K 的文件
  • -exec 表示对查找到的文件执行后续命令
  • cp {} ./tmp \; 表示将查找到的文件复制到 ./tmp 目录下,{} 表示查找到的文件名,\; 表示命令结束,注意需要加上空格。

补充:

vim下撤销刚才编辑操作

进入normal模式后按u

如何用ls判断一个目录中是否有另一个目录
 

ls /path/to/directory 2>/dev/null


如果目录不存在,ls 命令的错误输出将被重定向到 /dev/null 中,不会在终端上显示。如果目录存在,则 ls 命令会将目录下的内容打印到终端上。

如何将一个目录中所有文件转移到上一级目录中
可以使用mv命令将一个目录中所有文件转移到上一级目录中。假设当前目录为/path/to/dir,需要将该目录中的所有文件移动到/path/to目录下,则可以使用以下命令:

mv /path/to/dir/* /path/to/


这个命令会将/path/to/dir目录下的所有文件移动到/path/to目录下,而不包括子目录。如果目标目录中有同名文件,会提示是否覆盖,需要手动确认。如果想要自动覆盖目标目录中的同名文件,可以使用-f选项,即:

mv -f /path/to/dir/* /path/to/

法二:先find出目标文件,再循环放入

#!/bin/bash 
#先判断文件是否存在
if [ ! -d "tmp" ];then
  mkdir -p tmp
fi 
files=`find ./ -size +10k`
for items in $files 
do 
  mv $items tmp 
done 

法三:文件夹里循环找目标文件,判断语句有点绕,用了du与cut

#!/bin/bash

# 遍历当前目录下的所有文件
for file in *
do
  # 判断文件是否大于 10K
  if [ -f "$file" ] && [ $(du -k "$file" | cut -f1) -gt 10 ]
  then
    # 将文件移动到 ./tmp 目录下
    mv "$file" ./tmp
  fi
done

if [ -f "$file" ] && [ $(du -k "$file" | cut -f1) -gt 10 ]

这个条件语句是用来判断一个文件是否存在且大小是否大于10KB。具体解释如下:

  • if:如果后面跟随的条件语句成立,那么执行then后面的语句块;
  • [ -f "$file" ]:判断$file是否存在且为普通文件(非目录、链接等);
  • &&:逻辑运算符,表示“并且”;
  • [ $(du -k "$file" | cut -f1) -gt 10 ]:用于计算文件大小,du命令可以计算文件或目录所占用的磁盘空间大小,选项-k表示以KB为单位显示,cut命令用于从du输出中提取出文件大小(即第一个字段),[ ]表示条件语句,-gt是一个数值比较符,表示“大于”,10表示10KB。

因此,这个条件语句的意思是:如果$file存在且为普通文件,且文件大小大于10KB,则条件成立。

法四:利用ls与awk配合管道循环里将目标文件放入

#!/bin/bash

# 列出当前目录下的所有文件,并使用 awk 过滤出大小大于 10K 的文件
ls -l | awk '$5 > 10240 {print $9}' | while read file
do
  # 将文件复制到 ./tmp 目录下
  mv "$file" ./tmp
done

awk '$5 > 10240 {print $9}'

awk '$5 > 10240 {print $9}':使用awk命令查找当前目录中大小超过10KB的文件,并输出这些文件的路径。

因为ls中列出的第五个字段$5是文件大小,单位为字节,而第九个字段是文件路径

while read file

逐行读取awk命令的输出,并将当前行的内容保存到file变量中。

你可能感兴趣的:(linux学习,linux,bash)