需要简单的BASH脚本:移动和重命名文件

需要简单的BASH脚本:移动和重命名文件,bash,timestamp,renaming,Bash,Timestamp,Renaming,几十年前,我是一名程序员(IBM汇编、Fortran、COBOL、MS DOS脚本、一点Visual Basic)。因此,我熟悉IF-Then-Else、For循环等的一般性 然而,我现在需要为我目前的工作深入研究Bash,我在语法和适当的命令方面遇到了困难 我需要一个简单的(概念方面的)脚本,它将: 确定用户桌面上是否存在特定文件夹(例如,~/Desktop/Archive文件夹) 如果没有,则创建它(“归档”) 将桌面上的所有文件/文件夹(除了~/desktop/Archive)移动到“Ar

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

然而,我现在需要为我目前的工作深入研究Bash,我在语法和适当的命令方面遇到了困难

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

  • 确定用户桌面上是否存在特定文件夹(例如,
    ~/Desktop/Archive
    文件夹)
  • 如果没有,则创建它(“归档”)
  • 将桌面上的所有文件/文件夹(除了
    ~/desktop/Archive
    )移动到“Archive Folder”中,并在要移动的文件名末尾添加时间戳
  • 正是这最后一块——时间戳的添加——让我举步维艰

    我希望能有一个简单明了的解决办法。以下是我到目前为止得出的结论:

    #!/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环境、cmds及其论点基本上一无所知——这第一次请求帮助标志着我至少在精通BASH的过程中迈出了第一步

    更新 第一:非常感谢我得到的回复;它们非常有用

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

    我希望有一些见解;我觉得我在理解方面即将取得一些真正的进展,但这些异常现象阻碍了我的进步。以下是迄今为止我的(处理“问题”)代码:

    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
    
    这实际上基本上实现了我的目标,但是:

    • 在桌面存档文件夹已经存在的情况下,我希望if-then构造简单地遵循以下mkdir命令(不带echo msg),但是无论如何都会输出msg“Archives not exist,was created”msg(错误)。有什么原因的答案吗

    • 脚本完成时显示以下消息:

      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
    。事实上,这一举措实现了我的目标,但这一信息的出现对我来说毫无意义。无效论点是什么


    最后一点注意:在我的新手状态下,我正在寻找清晰易读的代码,而不是更优雅/复杂的单线管道命令解决方案。我期待着在适当的时候努力达到这些目标。

    你有几个选择。最简单的方法之一是循环浏览
    ~/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
    
    很抱歉,我忘了邮戳部分。正如评论中所指出的,您可以使用类似于以下内容的内容包含日期戳(根据您的喜好设置格式):

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

    OP询问要附加的时间戳,比如
    mv“$i”“$FOLDERARCH/${i}$(date+%s)”
    也许吧?很抱歉,我被那个请求搞砸了。是的,你是对的,你的邮戳会很好用的。邮戳的格式可以根据口味进行调整。谢谢。我向这里的社区表示歉意——在我被安排到其他项目后,我刚刚回到这里。不幸的是,我仍然有这个琐碎的任务的问题。我必须在明天(1月25日星期一)之前运行它,所以任何帮助都将是巨大的。我希望我能在这里以一种连贯的格式粘贴代码:顺便说一下,我在这些窗口中键入代码时经历了一段糟糕的时光,并让它保留了正确的逐行格式——在我看来,在我看来,它在运行时没有换行符。如果这是其他人的观点,请帮助我连贯地格式化。