• 13 Posts
  • 400 Comments
Joined 2 years ago
cake
Cake day: February 17th, 2024

help-circle



  • find /path/to/starting/dir -type f -regextype egrep -regex 'some[[:space:]]*regex[[:space:]]*(goes|here)' -exec mv {} /path/to/new/directory/ \;
    

    I routinely have to find a bunch of files that match a particular pattern and then do something with those files, and as a result, find with -exec is one of my top commands.

    If you’re someone who doesn’t know wtf that above command does, here’s a breakdown piece by piece:

    • find - cli tool to find files based on lots of different parameters
    • /path/to/starting/dir - the directory at which find will start looking for files recursively moving down the file tree
    • -type f - specifies I only want find to find files.
    • -regextype egrep - In this example I’m using regex to pattern match filenames, and this tells find what flavor of regex to use
    • -regex 'regex.here' - The regex to be used to pattern match against the filenames
    • -exec - exec is a way to redirect output in bash and use that output as a parameter in the subsequent command.
    • mv {} /path/to/new/directory/ - mv is just an example, you can use almost any command here. The important bit is {}, which is the placeholder for the parameter coming from find, in this case, a full file path. So this would read when expanded, mv /full/path/of/file/that/matches/the/regex.file /path/to/new/directory/
    • \; - This terminates the command. The semi-colon is the actual termination, but it must be escaped so that the current shell doesn’t see it and try to use it as a command separator.



  • No apologies necessary! This is incredibly helpful! I found in the documentation how to format the message with the basicConfig, so I’m going to get rid of the logDateTime, move the logger out of main (didn’t even think about how that would limit it to only main and not the other functions.), and test output to stdout vs the file defined in basicConfig.

    Gotta go to work, but will implement this later. Thank you!!





  • So, if I understand what you mean correctly, with logger, drop the function, and in the main script body (which is now under an if __name__ == "__main__": check, call logger directly something like:

    if __name__ == "__main__":
        load_dotenv()
        
        logDateTime = datetime.today().strftime("%Y-%m-%d %H:%M:%S")
        logger = logging.getLogger(__name__)
    
        currentForwardedPort = get_current_forwarded_port()
        currentListeningPort = get_current_listening_port()
    
        if currentForwardedPort != currentListeningPort:
            update_qbittorrent_listen_port(currentPort)
            logger.info(f"[{logDateTime}] qbittorrent listen port set to {currentForwardedPort}")
        else:
            loger.info(f"[{logDateTime}] forwarded port and listen port are a match")
    

    And then in the crontab I can do:

    0 * * * * /path/stuff/python script.py > /path/to/log/file.txt

    Thanks!