【问题标题】:Simple BASH script needed: moving and renaming files需要简单的 BASH 脚本:移动和重命名文件
【发布时间】:2016-04-11 04:14:23
【问题描述】:

几十年前我是一名程序员(IBM 汇编、Fortran、COBOL、MS DOS 脚本、一点 Visual Basic。)因此我熟悉 IF-Then-Else、For 循环等的通用性。

但是,我现在需要为我目前的工作深入研究 Bash,而且我很难使用语法和适当的命令来满足我的需求。

我需要一个简单的(概念方面的)脚本,它将:

  1. 确定用户桌面上是否存在特定文件夹(例如,~/Desktop/Archive 文件夹)
  2. 如果没有,请创建它(“存档”)
  3. 将桌面上的所有文件/文件夹(~/Desktop/Archive 除外)移动到“存档文件夹”中,并在要移动的文件名末尾附加时间戳。

正是这最后一块 - 时间戳添加 - 让我受不了。

我希望能以我的方式发送一个清晰而简单的解决方案。到目前为止,这是我想出的:

#!/bin/bash
shopt -s extglob
FOLDERARCH="Archive Folder"
cd ~/Desktop
if [ ! -d $"FOLDERARCH" ]; then
mkdir "$FOLDERARCH"
echo "$FOLDERARCH did not exist, was created"
fi
mv !(-d "$FOLDERARCH") "$FOLDERARCH"

最后一点:上面的脚本有效(没有时间戳)但也以消息结束

mv: rename Archive Folder to Folder/Archive Folder: Invalid argument

为什么?

任何帮助将不胜感激。请假设我基本了解 BASH 环境、cmd 及其参数 - 第一次寻求帮助标志着我迈向至少精通之旅的第一步。

更新

首先:非常感谢我收到的回复;它们非常有用。

我现在得到了它本质上是一个工作版本,但有一些我不明白的奇怪之处,经过数小时的尝试研究,还没有理解/解决。

我希望得到一些见解;我觉得我即将在理解方面取得一些真正的进展,但这些异常正在阻碍我的进步。到目前为止,这是我的(工作,有“问题”)代码:

shopt -s extglob
FOLDERARCH="Archives"
NEWARCH=$(date +%F_%T)
cd ~/Desktop
if [ ! -d $"FOLDERARCH" ]; then
    mkdir "$FOLDERARCH"
    echo "$FOLDERARCH did not exist, was created"
fi
mkdir "$FOLDERARCH/$NEWARCH"
mv !(-d "$FOLDERARCH") $FOLDERARCH/$NEWARCH

这实际上在很大程度上实现了我的目标,但是:

    1234563 , 已创建” 无论如何都会输出味精(错误地)。有什么原因的答案吗?
  • 脚本以以下消息完成:

    mv: rename Archives to Archives/2016-01-10_00:06:54/Archives: Invalid argument
    

我一点也不明白;应该发生的是桌面上的所有文件/文件夹,除了/Desktop/Archives 文件夹应该移动到新创建的/Desktop/Archives 的“子文件夹”中,例如/Desktop/Archives/2016-01-10_00:06:54。事实上,这一举动实现了我的目标,但信息的出现对我来说毫无意义。什么是无效参数?

最后一点:在我的新手状态下,我正在寻找清晰易读的代码,而不是更优雅/复杂的单行管道命令解决方案。我期待在适当的时候继续努力。

【问题讨论】:

  • 顺便说一句,我在这些窗口中输入我的代码并让它保持正确的逐行格式,这很糟糕——在我看来,在我看来,它可以在没有换行符的情况下继续运行它。如果这是其他人的观点,请帮助我连贯地格式化它。 .

标签: bash timestamp renaming


【解决方案1】:

您有多种选择。最简单的方法之一是遍历~/Desktop 下面的目录,如果它们不是"$FOLDERARCH",则将它们移动到"$FOLDERARCH",例如:

for i in */; do
    [ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH"
done

我还没有运行测试用例,但类似于以下内容应该可以工作。

#!/bin/bash
shopt -s extglob
FOLDERARCH="Archive Folder"
cd ~/Desktop || { printf "failed to change to '~/Destop'\n"; exit 1; }
if [ ! -d "$FOLDERARCH" ]; then
    if mkdir "$FOLDERARCH" , then
        echo "$FOLDERARCH did not exist, was created"
    else
        echo "error: failed to create '$FOLDERARCH'"
        exit 1
    fi
fi

for i in */; do
    [ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH"
done

抱歉,我忘记了 dateamp 部分。正如 cmets 中所指出的,您可以包含 dateamp(根据您的喜好设置格式),类似于以下内容:

tstamp=$(date +%s)
for i in */; do
    [ "$i" != "$FOLDERARCH"/ ] && mv "$i" "$FOLDERARCH/${i}_${tstamp}"
done

【讨论】:

  • OP 询问要附加的时间戳,比如 mv "$i" "$FOLDERARCH/${i}$(date +%s)" 也许?
  • 我很抱歉,我对那个要求说错了。是的,您是正确的,您的日期戳可以正常工作。可以根据需要调整日期戳的格式。谢谢。
  • 我在这里向社区道歉 - 在被拉到其他项目之后,我才刚刚回到这个问题上。不幸的是,我仍然对这个微不足道的任务有疑问。 . .我必须在明天(1 月 25 日星期一)之前运行它,所以任何帮助都会很大。我希望我能以一种连贯的格式在这里粘贴我的代码:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 2021-06-05
  • 1970-01-01
  • 2012-12-09
相关资源
最近更新 更多